跳转至

杜教筛

杜教筛可以在 \(O(n^{3/4})\) 或预处理 \(O(n^{2/3})\) 的时间复杂度内求出某些积性函数前 \(n\) 项的和。

考虑积性函数 \(f(x)\),我们要求出 \(s(x)=\sum_{i=1}^{x}f(i)\)\(n\) 的取值 \(s(n)\)。考虑构造另一积性函数 \(g(x)\) 满足 \(g(x)\)\((f*g)(x)\) 都可以快速求出前缀和。那么:

\[ \begin{align*} \sum_{i=1}^{n}(f*g)(i)&=\sum_{i=1}^{n}\sum_{j|i}f(j)g\Bigl(\frac ij\Big)\\ &=\sum_{i=1}^{n}\sum_{j=1}^{\lfloor n/i\rfloor}g(i)f(j)\\ &=\sum_{i=1}^{n}g(i)s\Bigl(\left\lfloor\frac ni\right\rfloor\Bigr) \end{align*} \]

移项:

\[ s(n)=\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)s\Bigl(\left\lfloor\frac ni\right\rfloor\Bigr) \]

后面一项用整除分块解决,并且本质不同的 \(s\bigl(\left\lfloor\frac ni\right\rfloor\bigr)\) 只有 \(O(n^{3/4})\) 种,用记忆化即可。

提前筛出 \(s\) 的前 \(n^{2/3}\) 项,可以将时间复杂度降低到 \(O(n^{2/3})\)

\(f(x)\) \(g(x)\) \((f*g)(x)\)
\(\mu(x)\) \(1(x)\) \(\epsilon(x)\)
\(\varphi(x)\) \(1(x)\) \(\operatorname{id}(x)\)
\(\sigma_k(x)\) \(\mu(x)\) \(\operatorname{id}^k(x)\)
\(x\times f(x)\) \(x\) \(x\times (f*1)(x)\)
\(x\times f(x)\) \(x\times g(x)\) \(x\times (f*g)(x)\)