杜教筛

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

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

posted @ 2021-06-17 14:17  nao-nao  阅读(45)  评论(0编辑  收藏  举报