若函数f满足
a,b互质有f(a*b)=f(a)*f(b),我们则称f是积性函数。
常见的比如欧拉函数,莫比乌斯函数,都属于积性函数。
线性筛法,利用积性函数的积性,筛素数同时可以计算积性函数。
然而有些问题要求低于线性的复杂度。
同样利用积性函数的性质。
举常见的莫比乌斯函数为例。
求 ∑ni=1μ(i) (1<=n<=10^10)
线性复杂度显然无法接受。
杜教筛法如何解决呢?
∑d|nμ(d)=[n=1]
设s(n)= ∑ni=1μ(i)
s(n)= ∑ni=1∑d|iμ(d)−∑ni=1∑d|i(d<i)μ(d)
=1- ∑ni=1∑d|i(d<i)μ(d)
接下来一步十分机智,考虑因为 d|i且d<i所以有i/d>=2
于是有
s(n)=1- ∑ni=2∑⌊ni⌋d=1μ(d) (这里的i表示的是d的几倍)
=1- ∑ni=2s(⌊ni⌋)
可以加上分块和记忆化优化, 复杂度为O( n34 )(怎么算出来的——不会算)
还可以继续优化,先预处理出 n23 内的s的值,递归到时就可以直接返回,复杂度为O( n23 ),这就很可观了。
如果是求 ∑ni=1φ(i) ,利用 ∑d|nφ(d)=n ,一样的做就好了。
当然,有些积性函数并没那么好算,但出题人如果不是丧心病狂的话,通常是能用些机智做法做的。
例如f(x)= x∗μ(x) ,显然,f是一个积性函数
∑d|xf(d)∗x/d=[n=1]
设S(x)= ∑ni=1f(i) ,结合上者则有
S(x)= 1−∑xi=1∑d|i(d<i)f(d)∗(i/d)
= 1−∑xi=2∑⌊xd⌋d=1f(d)∗i
= 1−∑xi=2i∗S(⌊xd⌋)
杜教筛会单独被考吗?这样就水了,通常会和比较复杂的反演搞在一起。但是只要涉及积性函数,我们应有意识的想到杜教筛。