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