杜教筛
令 \(f(x)\) 为某个积性函数,\(s(n)=\sum\limits_{i=1}^nf(i)\),我们构造另一干函数 \(g\) 算 \(f*g\) 的前缀和。
\[\begin{aligned} \sum\limits_{i=1}^n(f*g)(i)=\sum\limits_{i=1}^n\sum\limits_{d|i}g(d)f(\dfrac{i}{d})=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\left\lfloor\tfrac{n}{d}\right\rfloor}f(i)=\sum\limits_{d=1}^ng(d)s(\left\lfloor\dfrac{n}{d}\right\rfloor) \end{aligned} \]我们的目标是 \(s(n)\)
我们发现:
\[\begin{aligned} g(1)s(n)=\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{d=2}^ng(d)s(\left\lfloor\dfrac{n}{d}\right\rfloor) \end{aligned} \]我们需要算出 \((f*g)\) 的前缀和,通过对减号右边数论分块,我们需要算 \(g\) 的前缀和,我们还需要算出 \(g(1)\) 。所以关键在于 \(g\) 函数的选取。
例子
- \(\sum\limits_{i=1}^N\mu(i)\)
不难发现我们这里应该选 \(g\) 函数为 \(I\) 。然后 \(g\) 的前缀和为 \(n\),\(f*g\) 的前缀和是 \(1\)。
- \(\sum\limits_{i=1}^N\phi(i)\)
不难发现我们还是选 \(g\) 为 \(I\)。然后 \(g\) 的前缀和为 \(n\),\(f*g\) 的前缀和为 \(\dfrac{n(n+1)}{2}\)
- \(\sum\limits_{i=1}^N\phi(i)\times i\)
考虑有:
\[\begin{aligned} (f*g)(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})=\sum\limits_{d|n}\phi(d)\times d\times g(\dfrac{n}{d}) \end{aligned} \]考虑把 \(d\) 消掉,所以我们不妨令 \(g=id\),这样这个题就结束了。
- \(\sum\limits_{i=1}^N\phi(i)\times i^2\)
我们还是和上面一样,把它拆开:
\[\begin{aligned} (f*g)(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})=\sum\limits_{d|n}\phi(d)\times d^2\times g(\dfrac{n}{d}) \end{aligned} \]我们本着把 \(d^2\) 消去的思路,不妨令 \(g(x)=x^2\),这样就可以了。
复杂度证明
设 \(k\) 以前的部分我们预处理,所以杜教筛的复杂度为:
\[\sum\limits_{i=1}^{\frac{n}{k}}\sqrt{\left\lfloor\frac{n}{i}\right\rfloor}\le \int_{1}^{\frac{n}{k}}\sqrt{n}x^{-\frac{1}{2}}dx=O(\frac{n}{\sqrt{k}}) \]所以总复杂度应该为 \(O(\frac{n}{\sqrt{k}}+k)\),显然 \(k=n^{\frac{2}{3}}\) 的时候最优,所以总复杂度为 \(O(n^\frac{2}{3})\) 。
相反,如果不预处理的话,相当于要对所有可能的 \(\lfloor\frac{n}{i}\rfloor\) 做一个整数分块,一共有 \(O(\sqrt{ n})\) 种取值,我们不妨认为这 \(O(\sqrt n)\) 种取值为 \(\lfloor\frac{n}{1}\rfloor,\lfloor\frac{n}{2}\rfloor,\cdots,\lfloor\frac{n}{\sqrt n}\rfloor\),实际上,整数分块得到的数不会超过 \(2\sqrt{ n}\) 个,用这 \(\sqrt{n}\) 个最大的值来估算显然是正确的。
所以时间复杂度约为:
\[\int _1^{\sqrt{n}}\sqrt{\frac{n}{x}}dx=O(n^{\frac{3}{4}}) \] 标签:lfloor,frac,limits,sum,sqrt,杜教,aligned From: https://www.cnblogs.com/HeNuclearReactor/p/17552186.html