积性函数求前缀和

积性函数定义

若函数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=1d|iμ(d)ni=1d|i(d<i)μ(d)
=1- ni=1d|i(d<i)μ(d)
接下来一步十分机智,考虑因为 d|id<ii/d>=2
于是有
s(n)=1- ni=2nid=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)= 1xi=1d|i(d<i)f(d)(i/d)
= 1xi=2xdd=1f(d)i
= 1xi=2iS(xd)

小结

杜教筛会单独被考吗?这样就水了,通常会和比较复杂的反演搞在一起。但是只要涉及积性函数,我们应有意识的想到杜教筛。

你可能感兴趣的:(数论,杜教筛)