积性函数定义
若函数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⌋)
小结
杜教筛会单独被考吗?这样就水了,通常会和比较复杂的反演搞在一起。但是只要涉及积性函数,我们应有意识的想到杜教筛。