杜教筛

杜教筛

\(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}}) \]

posted @ 2023-07-13 21:06  NuclearReactor  阅读(23)  评论(0)    收藏  举报