前言
杜教筛是杜瑜皓引入国内的一种非线性复杂度内求积性函数前缀和的算法。
对于前 \(n^{2/3}\) 的范围线性筛,其余进行递归处理。
时间复杂度 \(O(n^{2/3})\)
前置知识
- 狄利克雷卷积
- 常见的积性函数
实现
假设我们要求 \(sum(n)=\sum\limits_{i=1}^{n} f(i)\) ,不妨构造 \(g\) 使得 \(h=f*g\) 。
则
\[\sum\limits_{i=1}^{n}h(i)=\sum\limits_{i=1}^{n} \sum\limits_{j|i} g(j)f(\frac{i}{j}) \]
\[=\sum\limits_{j=1}^{n} g(j)\sum\limits_{i=1}^{\lfloor \frac{n}{j}\rfloor} f(i) \]
\[=\sum\limits_{j=1}^{n} g(j) sum(\lfloor \frac{n}{j}\rfloor) \]
因此
\[g(1)sum(n)=\sum\limits_{i=1}^{n} h(i) - \sum\limits_{j=2}^{n} g(j)sum(\lfloor \frac{n}{j}\rfloor) \]
直接整除分块,递归处理即可。
注意这里的 \(h\) 和 \(g\) 要尽可能构造的简单,以方便计算。
examples
- \(\sum\limits_{i=1}^{n} \varphi(n)\)
令 \(g=I\) ,则有 \(h=\varphi * I = id\) ,因此
\[sum(n)=\frac{n(n+1)}{2}-\sum\limits_{j=2}^{n} sum(\lfloor \frac{n}{j}\rfloor) \]
- \(\sum\limits_{i=1}^{n} \mu(n)\)
令 \(g=I\) ,则有 \(h=\mu * I = ϵ\) ,因此
\[sum(n)=1-\sum\limits_{j=2}^{n} sum(\lfloor \frac{n}{j}\rfloor) \]