杜教筛
Posted Ra1nbow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杜教筛相关的知识,希望对你有一定的参考价值。
从省选开始挖的坑现在补..
很好的参考资料..
填坑计划
这是由杜老师引进中国oi的算法.. 用低于线性时间来算积性函数的前缀和
一般就是找另外一个积性函数卷积起来变成一个更方便计算前缀和的东西,以降低数据规模从而达到降低时间复杂度
比如说要计算$\sum_{i=1}^n\mu(i)$,由于$1*\mu=\epsilon$,也就是先计算$\epsilon$的前缀和
$$\sum_{i=1}^n\epsilon(i)=\sum_{i=1}^n\sum_{d|n}\mu(d)$$
设$i‘d=i$
$$\sum_{i=1}^n\sum_{d|n}\mu(d)=\sum_{i‘=1}^n\sum_{d=1}^{\lfloor\frac{n}{i‘}\rfloor}\mu(d)$$
把$i‘=1$的分离出来就是要求的$S(n)$
$$\sum_{i‘=1}^n\sum_{d=1}^{\lfloor\frac{n}{i‘}\rfloor}\mu(d)=\sum_{d=1}^{n}\mu(d)+\sum_{i‘=2}^n\sum_{d=1}^{\lfloor\frac{n}{i‘}\rfloor}\mu(d)$$
后面的一段就是缩小规模的求前缀和了.. 递归即可,要记忆化
这样子的复杂度是$O(n^{\frac{3}{4}})$,如果线性筛前面$n^{\frac{2}{3}}$就可以做到$O(n^{\frac{2}{3}})$
按照吉丽说的一般有这样两种形式:
1)求$S(n)=\sum\limits_{i=1}^n(f\cdot g)(i)$,且$g(i)$为完全积性函数
$$\sum_{i=1}^n[(f*1)\cdot g](i)=\sum_{i=1}^ng(i)S(\lfloor\dfrac{n}{i}\rfloor)$$
2)求$S(n)=\sum\limits_{i=1}^n(f*g)(i)$
$$\sum_{i=1}^ng(i)\sum_{ij\leq n}(f*1)(j)=\sum_{i=1}^nS(\lfloor\dfrac{n}{i}\rfloor)$$
以上是关于杜教筛的主要内容,如果未能解决你的问题,请参考以下文章