杜教筛

杜教筛可以用来快速求一个积性函数的前缀和。比如我们需要求函数 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))

递归并且记忆化计算即可。

原文地址:https://www.cnblogs.com/nao-nao/p/14893278.html