杜教筛

也许更好的阅读体验

作用与使用前提

对一个积性函数(f),我们要求(f)的前(n)项和(S_n),并且要求在比线性复杂度更低的复杂度情况下求出
若有数论函数(g,h),满足
(h=f*g)
其中(*)为狄利克雷卷积
并且(h)的前缀非常好求,(g)的单项非常好求,我们就可以快速的求出(f)的前缀和


求法

先看(f,g,h)的关系
(egin{aligned}h(n)=sum_{d|n}f(frac{n}{d})g(d)end{aligned})
我们对(h)求前缀和,则有
(egin{aligned}sum ^{n}_{i=1}hleft( i ight) &=sum ^{n}_{i=1}fast gleft( i ight)\ &=sum ^{n}_{i=1}sum _{dli}fleft( dfrac {n}{a} ight) gleft( d ight) \ &=sum ^{n}_{d=1}gleft( d ight) sum ^{frac {n}{d}}_{i=1}fleft( i ight) \ &=sum ^{n}_{d=1}gleft( d ight) S_{frac {n}{d}}\ \ end{aligned})
接下来我们把(d=1)的情况单独提出来

(egin{aligned}sum ^{n}_{i=1}hleft( i ight) &=g(1)S_n+sum ^{n}_{d=2}gleft( d ight) S_{frac {n}{d}}end{aligned})

再把(S_n)写到左边
(egin{aligned}S_{n}=dfrac {left( sum ^{n}_{i=1}hleft( i ight) ight) -left( sum ^{n}_{i=2}gleft( i ight) S _frac {n}{i} ight) }{gleft( 1 ight) }end{aligned})
对一般的数论函数(g),通常(g(1)=1),于是我们可以把(g(1))省掉,得到
(egin{aligned}S_{n}=left( sum ^{n}_{i=1}hleft( i ight) ight) -left( sum ^{n}_{i=2}gleft( i ight) S_ frac {n}{i} ight) end{aligned})

于是我们可以先预处理出来(S_1,S_2,cdots S_m)(m)取一个较大的数,如(10^6)
之后我们可以通过记忆化搜索的方法来求解(S_n)


举例

(mu)

我们要求(mu)的前缀和,即(f=mu)
我们知道(I=xi*mu)
其中(xi(n)=1,I(n)=[n=1])
那么
(egin{aligned}S_{mu(n)}&=left( sum ^{n}_{i=1}Ileft( i ight) ight) -left( sum ^{n}_{i=2}xileft( i ight) S _{mu(frac {n}{i})} ight) \ &=1 - sum ^{n}_{i=2} S _{mu(frac {n}{i})}\ end{aligned})

(varphi)

或者要求(varphi)的前缀和,即(f=varphi)
我们知道(varphi)的一条性质
(egin{aligned}n=sum _{d|n}varphi left( d ight)end{aligned})
然后我们知道一个数论函数(id)并且(id(n)=n)
于是这条性质我们也可以写成
(id=varphi*xi)
我们再套上面的公式,即可得到
(egin{aligned}S_{varphi(n)}&=left( sum ^{n}_{i=1}idleft( i ight) ight) -left( sum ^{n}_{i=2}xileft( i ight) S _{varphi(frac {n}{i})} ight) \ &=dfrac{nleft(1+n ight)}{2} - sum ^{n}_{i=2} S _{varphi(frac {n}{i})} end{aligned})

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

原文地址:https://www.cnblogs.com/Morning-Glory/p/11335617.html