杜教筛可以用来快速求一个积性函数的前缀和。比如我们需要求函数 f 的前缀和。
首先我们需要找到两个函数 g,h 使得 (h = f*g) 。
显然有 (sumlimits_{i=1}^n h(i) = sumlimits_{i=1}^n sumlimits_{dmid i}f(frac{i}{d})g(d))
然后有 (sumlimits_{i=1}^n h(i) = sumlimits_{d}g(d) sumlimits_{i=1}^{leftlfloorfrac{i}{d} ight floor} f(i))
设 (S(n) = sumlimits_{i=1}^nf(i))
可以有 (sumlimits_{i=1}^n h(i) = sumlimits_{d}g(d) S(leftlfloorfrac{i}{d} ight floor) = g(1)S(n) + sumlimits_{d=2}g(d) S(leftlfloorfrac{i}{d} ight floor))
最后有 (g(1)S(n) = sumlimits_{i=1}^n h(i) - sumlimits_{d=2}g(d) S(leftlfloorfrac{i}{d} ight floor)) 。
递归并且记忆化计算即可。