2022.8.3 闲话

模拟赛 so boring,打完 T2 T3 和 T4 暴力就跑去看 min25 筛,结果还没看懂,,,,

《しんかいしょうじょ》

悲しみの海に沈んだ私 目を开けるのも亿劫

このままどこまでも堕ちて行き 谁にも见つけられないのかな

どこへ向かい、何をすれば? ふと射し込む一筋の光

手を伸ばせば届きそうだけど 波に拐(さら)われて见失った

あれは一体なんだったのかな あたたかくて眩しかったの

无意识のカウンターイルミネーション 嘘つきは谁?

深海少女 まだまだ沈む

暗闇の彼方へ闭じこもる

深海少女 だけど知りたい

心惹かれるあの人を见つけたから

昼も夜も无かったこの场所 なのに眠れない夜は続く

自由の羽大きく広げて 泳ぐあなたは绮丽でした

そしてまた光は降りそそぐ 见とれていたら目が合った

気付いてこっちを振り返るあなたに 嘘つきな私…

深海少女 わざわざ沈む

暗闇のさなかに赤い頬

深海少女 ハダカの心を见せる勇気

黒い海がまだ许さない

こんなに服は汚れてしまった 笑颜も丑くゆがんでいった

谁にも合わせる颜なんて无いの もう放っておいてよ!

声にならない気持ちが溢れてとけた

次の瞬间、君が突然姿を消した

心配性の 彼女は焦る

闇が彼を隠しひとりきり

限界少女 その手を伸ばす

「ほらね、君も素敌な色を隠してた」

深海少女 腕を引かれる

歌う祝福のマリンスノー

深海少女 もっと知りたい

心惹かれるあの人を见つけたから

この海を出て 今飞び立つの

约定:\(\mathbb P\) 为素数集,\(\{p\}\) 为素数序列(从小到大).

杜教筛

杜教筛

对于一个积性函数 \(f\),我们构造一个 \(g\) 出来,只要能快速求解 \(f*g\)\(g\) 的前缀和那么 \(f\) 的前缀和就好求 .

\(S\)\(f\) 的前缀和,则:

\[\begin{aligned}\sum_{i=1}^n(f*g)(i)&=\sum_{i=1}^ng(i)\sum_{j=1}^{\lfloor\frac ni\rfloor}f_j\\&=\sum_{i=1}^ng(i)S\left(\left\lfloor\dfrac ni\right\rfloor\right)\end{aligned} \]

取出 \(S(n)\) 移左边则得到

\[S(n)=\dfrac1{g(1)}\left(\sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(i)S\left(\left\lfloor\dfrac ni\right\rfloor\right)\right) \]

后面是整除分块 .

如果 \(f*g\)\(g\) 都能 \(O(1)\) 求前缀和,则时间复杂度是 \(O(n^{2/3})\) .


Sum

给定正整数 \(n\),求

\[\begin{aligned}S_{\varphi}(n)&=\sum_{i=1}^n\varphi(i)\\S_{\mu}(n)&=\sum_{i=1}^n\mu(i)\end{aligned} \]

\(\varphi*1=\mathrm{Id}\)\(\mu*1=\varepsilon\),然后杜教筛就完了 .

Powerful Number 筛

超过 \(90\%\) 的人都不知道!居然能这样用 \(O(\sqrt n)\) 次运算求出 \(n\) 个数之和!网友:长见识了(?

定义:若一个数满足它所有质因子的幂都不小于 \(2\),则称它为 Powerful Number(简记为 PN).

约定 Powerful Number 组成的集合为 \(\mathbf{PN}\) .


Powerful Number 的数量级分析:

Lemma

Powerful Number 即可以被写作 \(a^2b^3\) 形式的数 .

证明:考虑把奇数幂丢到 \(b\),偶数幂丢到 \(a\) .

那么枚举 \(a\),再求有多少 \(b\) 满足 \(a^2b^3\le n\) .

于是不大于 \(n\) 的 Powerful Number 的数量即为

\[\begin{aligned}c(n)&=\sum_{a=1}^n\left(\left\lfloor\dfrac n{a^2}\right\rfloor\right)^{1/3}\\&=O\left(\int_0^{\sqrt n}\left(\dfrac n{z^2}\right)^{1/3}\mathrm dz\right)\\&=O\left(n^{1/3}\int_0^{\sqrt n}z^{-2/3}\mathrm dz\right)\\&=O(3n^{1/2})\\&=O(\sqrt n)\end{aligned} \]

于是我们直接按 \(a^2b^3\) 爆搜出所有 Powerful Number 就是 \(O(\sqrt n)\) .


当然上面那些东西用处并不是很大,现在说一下 Powerful Number 筛(PN 筛).

若我们要求积性函数 \(f\) 的前缀和,且存在一个积性函数 \(g\),满足素数处点值相等(即对于 \(p\in\mathbb P\),有 \(g(p) = f(p)\)),且 \(g\) 易求前缀和,那么就可以用 PN 筛 .

\(f=g*h\),则显然 \(h=f*g*\mu\) 为积性函数 .

则可以发现 \(h(1)=f(1)\cdot g(1)\cdot\mu(1) = 1\) .

又对于素数 \(p\),有 \(f(p)=g(1)h(p)+g(p)h(1)\),则可以得到 \(h(p)=0\) .

所以对于非 Powerful Number 的 \(n\),因为 \(n\) 有至少一个因子满足幂是 \(1\),且 \(h\) 是积性函数,可以知道 \(h(n)=0\)

从而

\[\begin{aligned}\sum_{i=1}^nf(i)&=\sum_{i=1}^n\sum_{d\mid i}h(i)g\left(\dfrac id\right)\\&=\sum_{d=1}^nh(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}g(i)\\&=\sum_{d\in[1,n]\cap\mathbf{PN}}h(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}g(i)\end{aligned} \]

如果 \(g\) 的前缀和可以快速计算,并且 \(h\) 可以快速求出就好了 .

因为 \(h\) 是积性函数,只需算出所有 \(p\in\mathbb P, h(p^k)\) 即可 .

如果 \(h\) 的公式推不出来可以考虑 \(\displaystyle f(p^k)=\sum_{i=0}^kh(p^i)g(p^k-i)\) .

于是 \(\displaystyle h(p^k)=f(p^k)-\sum_{i=0}^{k-1}h(p^i)g(p^{k-i})\) .

于是枚举 \(k\) 算即可,\(p^k\) 只会有 \(\log\) 个取值 .

然后因为 Powerful Number 是 \(O(\sqrt n)\) 的,所以 PN 筛也是 \(O(\sqrt n)\) 复杂度 .

Power Replacer

有一个函数,满足:

  • \(f(p^q)=p^k\)\(k\) 是常数)
  • 对于 \(a\perp b\)\(f(ab) = f(a)f(b)\) .

给一个 \(n\),求 \(\displaystyle\sum_{i=1}^nf(i)\)\(n\le 10^{13}\)\(k\le 20\) .

min25 能做,但是跑不动 \(10^{13}\) .

构造 \(g(x) = x^k\),则令 \(f=g*h\),可以得到 \(h(p^s)=p^k-p^{2k}\) .

然后 PN 筛就好了 .

min25 筛

原理

用来筛积性函数前缀和,只需要积性函数在 \(p^k\) 处为一个关于 \(p\) 的多项式 .

首先把正整数分为 \(1\),素数和合数,并且我们要求一个积性函数 \(f\) 的前缀和 .

\(\operatorname{minp}(n)\)\(n\) 的最小素因子,则定义

\[S(n,j)=\sum_{i=2}^nf(i)[\operatorname{minp}(i)\ge p_j] \]

那么可以发现答案就是 \(S(n,1) + f(1)\) .

现在考虑如何求 \(S\),因为 \(f\) 是积性函数,所以对于每个合数我们可以拆成两数乘积(素数当然是直接算).

我们枚举最小质因子 \(p_k\) 和其次数 \(e\),然后计算 \(2\)\(n\) 中所有满足最小质因子为 \(p_k^e\) 的数,然后递归下去 .

\[S(n,j)=\sum_{p_i\le n}f(p_i)+\sum_{k\ge j,p_k^2\le n}\sum_{e\ge 1,p_k^{e+1}\le n}\left(S\left(\left\lfloor\dfrac n{p_k^e}\right\rfloor,k+1\right)f(p_k^e)+f(p_k^{e+1})\right) \]

\(f(p_k^{e+1})\) 是为了补上 \(f(1)\) .

然后我们的问题就变成如何快速计算 \(\displaystyle\sum_{p_i\le n}f(p_i)\) .

\(\displaystyle G(n,j)=\sum_{i=2}^n[i\in\mathbb P\lor\operatorname{minp}(i)>p_j]i^k\) .

这个相当于是素数的值加上埃氏筛筛掉 \(p_{1\dots j}\) 的倍数后的答案 .

注意到 \(p_j^2>n\) 时就不会被筛了,于是 \(p_j^2>n\) 时,\(G(n,j)=G(n,j-1)\) .

否则,我们考虑减去被 \(p_j\) 筛掉的数 . 因为不筛质数,所以减去质数,如下:

\[G(n,j)=G(n,j-1)-p_j^x\left(G\left(\left\lfloor\dfrac n{p_j}\right\rfloor,j-1\right)-\sum_{i=1}^{j-1}p_i^x\right) \]

\(G(n)=G(n,+\infty)\),于是 \(G(n)\) 就是素数前缀和 .

于是我们前面那个 \(S\) 的表达式就可以改成

\[S(n,j)=G(n)-\sum_{i=1}^{j-1}f(p_i)+\sum_{k\ge j,p_k^2\le n}\sum_{e\ge 1,p_k^{e+1}\le n}\left(S\left(\left\lfloor\dfrac n{p_k^e}\right\rfloor,k+1\right)f(p_k^e)+f(p_k^{e+1})\right) \]

递归计算,可以证明时间复杂度为 \(\displaystyle O\left(\dfrac{n^{\frac34}}{\log n}\right)\)(假定 \(f\) 可以 \(O(1)\) 计算).

实际上后缀和优化才是 \(\displaystyle O\left(\dfrac{n^{\frac34}}{\log n}\right)\),朴素递归是 \(O(n^{1-\varepsilon})\) .

例子

注意 min25 筛的 \(G\) 部分只可以计算素数幂的点值前缀和 .

在求解 \(S\) 的时候,我们必须可以快速计算 \(f\) 在前 \(j\) 个质数的前缀和和 \(f(p_k^{e+1})\) .

也就是我们需要把 \(f(p)\) 转化为多项式,以计算素数处的点值前缀和 .

注意到 \(j>\sqrt n\) 时就只剩下素数了,所以没有计算的必要,所以只需要求 \(j\le\sqrt n\) 的素数处前缀和,可以线性筛实现 .

单点查询一般是平凡的 .


素数之和

给定正整数 \(n\),求

\[\begin{aligned}\pi(n)&=\sum_{i=1}^n[i\in\mathbb P]\\\pi^{\star}(n)&=\sum_{i=1}^ni\cdot[i\in\mathbb P]\end{aligned} \]

\(f(x)=1\)\(f(x)=x\) 即可.


Sum

给定正整数 \(n\),求

\[\begin{aligned}S_{\varphi}(n)&=\sum_{i=1}^n\varphi(i)\\S_{\mu}(n)&=\sum_{i=1}^n\mu(i)\end{aligned} \]

对于 \(p\in\mathbb P\),注意到 \(\mu(p)=-1\)\(\varphi(p)=p-1\),所以算一下素数和和素数个数即可 .


简单的函数

有一个函数 \(f\),满足

  • \(f(1)=1\) .
  • 对于 \(p\in\mathbb P\),有 \(f(p^c)=p\oplus c\) .
  • 对于 \(a\perp b\),有 \(f(ab)=f(a)f(b)\) .

给一个 \(n\),求 \(\displaystyle\sum_{i=1}^nf(i)\)\(n\le 10^{10}\) .

根据定义可以得到 \(f(2)=3\)\(f(p)=p-1\),这个 \(2\) 比较特殊先排掉,于是就是 min25 筛板子了 .

发现算 \(S\) 的时候只有 \(S(n,1)\) 会算到 \(2\),于是对于 min25 筛的神秘式子

\[S(n,j)=G(n)-\sum_{i=1}^{j-1}f(p_i)+\sum_{k\ge j,p_k^2\le n}\sum_{e\ge 1,p_k^{e+1}\le n}\left(S\left(\left\lfloor\dfrac n{p_k^e}\right\rfloor,k+1\right)f(p_k^e)+f(p_k^{e+1})\right) \]

来说,\(j=1\) 时后面的显而易见算不到 \(2\),只有前面那个前缀和会算到,于是特判一下给答案 \(+2\) 即可 .


梦中的数论

给一个正整数 \(n\),求

\[\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n[j\mid i][(j+k)\mid i] \]

\(n\le 10^{10}\) .

\[\begin{aligned}ans&=\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n[j\mid i][(j+k)\mid i]\\&=\sum_{i=1}^n\dfrac12\sum_{j\neq l, l\ge 1}[j\mid i\land l\mid i]\\&=\sum_{i=1}^n\dbinom{d(i)}2\\&=\dfrac 12\sum_{i=1}^n(d(i)^2-d(i))\end{aligned} \]

min25 筛算一下 \(d(i)^2\)\(d(i)\) 的前缀和即可 .

组合意义数论题


Bags of Candies

把集合 \(S=\{1,2,3,\dots,n\}\) 划分为若干个集合 \(T_{1\dots k}\),对于所有 \(i\in[1,k]\),满足:

  • \(\gcd(T_i)\neq 1\)
  • \(|T_i|\le 2\) .

\(k\) 的最小值 .

\(n\le 10^{11}\) .

首先 \(1\) 和大于 \(\dfrac n2\) 的素数自成一组 .

之后可以发现,对于剩下的所有数,都可以两个数一组配对 .

考虑对于每个数,取它的最大质因子,把最大质因子一样的放在一组 .

这样如果一组里有偶数个数就直接配对 。

如果有奇数个数,考虑令这一组的最大质数是 \(p\),那么留下 \(2p\),把剩下的配对,这样最后剩下的都有因子 \(2\),依然可以配对 .

这样就只需要区间素数个数查询,min25 筛即可 .


Misaka Network 与求和

给两个正整数 \(n,k\),求

\[\sum_{i=1}^n\sum_{j=1}^nf(\gcd(i,j))^k \]

其中 \(f\) 是非严格次大素因子 . 特别的,\(f(1)=0\),对于素数 \(p\)\(f(p)=1\) .

\(n,k\le 2\times 10^9\),答案对 \(2^{32}\) 取模 .

首先平凡莫反可以得到答案是

\[\sum_{i=1}^n\left\lfloor\dfrac ni\right\rfloor^2(f^k*\mu)(i) \]

过程不详细展开 .

整除分块,问题就变成求 \(f^k*\mu\) 的前缀和 .

显而易见 \(f^k*\mu*1=f^k\),于是只需要求 \(f^k\) 的前缀和\(1\) 的前缀和即可杜教筛求解 .

考虑 min25 筛的过程,min25 筛其实就是在给所有数加最小因子上去,那么加的时候,已经产生了次大因子的数的值必然不会变 .

考虑魔改 min25 筛,令 \(S(n,j)\) 表示 \(\le n\) 的数,\(G\) 是素数数量则可以得到

\[S(n,j)=p_j^k\sum_{i\in\mathbb P}[i\ge p_j]+\sum_{i\ge j,p_j^2\le n}\sum_{e\ge 1, p_i^{e+1}\le n}S\left(\left\lfloor\dfrac n{p_i^e}\right\rfloor,i+1\right)+p_i^k \]

注意我们的次大素因子是钦定出来的,所以,我们要选一个更大的素数当最大的素因子,这只需要求有多少更大的素数,于是 \(G\) 是素数数量 .

时间复杂度 \(O(狂笑)\) .

Min25 loves 于神之怒


彩蛋

不用线段树的扫描线?你这不标题党吗?

就是啊,扫描线怎么可能不用线段树呢?


方法来自 pocafup,原文链接 .

矩形面积并

给若干个矩形,求面积并 .

我们根据 \(x\) 排序,对于相等的 \(x\),将 \(y\) 进入和退出分类讨论,然后全部放进 std :: set 里面 . 每次 \(x\) 不相等的时候,答案就是 \(y_L\cdot(x_{now}-x_{lst})\)\(y_L\) 是现在 \(y\) 覆盖的)

将每个长方形的上方点记做出口,下方点记做入口 . 用一个 std :: set 记录在某区间内所有的 \(y\) 值 . 记一个 \(S\),每次从下往上扫,如果某个 \(y\) 是入口就将 \(S\) 自增 \(1\),否则就自减 \(1\) . 如果 \(S=0\) 的时候就将你整个区间的值加到答案里面 .

posted @ 2022-08-03 19:41  Jijidawang  阅读(112)  评论(7编辑  收藏  举报
😅​