杜教筛

1|0杜教筛

1|0前置知识

积性函数:对于任意的gcd(i,j)=1f(i)×f(j)=f(ij)

完全积性函数:对于任意的i,jf(i)×f(j)=f(ij)

ϵ(x)=[x==1]I(x)=1id(x)=xσk(x)=d|xdk

1|0狄利克雷卷积

(fg)(n)=d|nf(d)g(nd)

推论:

1.μI=ϵ

证明:当n=1时上式显然为1,当n>1时,根据唯一分解定理,设n=p1a1p2a2pkak,根据μ的定义,若ai>1μ(d)为0,则d|nμ(d)=i=0k(ki)(1)i=(11)k=0

2.φI=id

证明:当n=pm时,d|nφ(d)=φ(1)+i=1mφ(pi)=1+i=1m(pipi1)=pm=n

n为任意整数时,令n=pm,则(φI)(pm)=(φI)(p)=pm=n

3.μid=φ

证明:

id=φI

μid=φ(Iμ)

μid=φϵ=φ

1|0莫比乌斯反演

g(n)=d|nf(d)

f(n)=d|nμ(d)g(nd)

证明:因为g=(fI),所以gμ=fIμ=f(Iμ)=fϵ=f

1|1杜教筛

杜教筛是用来快速求积性函数前缀和的方法。具体来说,我们设S(n)=i=1nf(i),再找一个积性函数g(x),考虑(fg)的前缀和

i=1n(fg)(i)=i=1nd|if(d)g(id)=d=1ng(d)i=1ndf(i)=d=1ng(d)S(nd)

我们把g(1)S(n)提出来,就是g(1)S(n)=i=1ng(i)S(ni)i=2ng(i)S(ni),我们发现,前一项i=1ng(i)S(ni)由前面推导可知为i=1n(fg)(i),于是得到了杜教筛的核心式子:

g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)

这就意味着,只要我们找到一个可以快速计算(fg)的前缀和的g(x),我们就可以用数论分块递归求解S(n),时间复杂度是O(n34),如果我们预处理前n23个答案,我们就可以把复杂度降到O(n23)

1|0一些应用

1.求μ的前缀和

因为μI=ϵ,所以把I(x)当做g(x)即可,而且前缀和超好求。

代码:

inline int calcmu(int x){ if(x<=M)return summu[x]; if(mp.find(x)!=mp.end())return mp[x]; int ans=1; for(int l=2,r;l<=x;l=r+1){ r=x/(x/l); ans=(ans-(r-l+1)%p*calcmu(x/l)%p)%p+p)%p; } return mp[x]=ans; }

2.求φ的前缀和

因为φI=id,所以把I(x)当做g(x)即可。

代码:

inline int calcphi(int x){ if(x<=M)return sumphi[x]; if(mp.find(x)!=mp.end())return mp[x]; int ans=x*(x+1)/2%p; for(int l=2,r;l<=x;l=r+1){ r=x/(x/l); ans=(ans-((r-l+1)%p*calcphi(x/l)%p)%p+p)%p; } return mp[x]=ans; }

1|0例题

1.P4213 【模板】杜教筛(Sum)

就是求μ,φ的前缀和,直接套板子。

2.P3768 简单的数学题

题意:求i=1nj=1nijgcd(i,j)

思路:

i=1nj=1nijgcd(i,j)=i=1nj=1nijk|i,k|jφ(k)

=k=1nφ(k)k|ik|jij

=k=1nφ(k)k2(i=1nki)2

然后考虑怎么求前一项
f=μididg=idid,则(fg)(n)=d|n(φ(d)d2)(nd)2=n3,这样就又可以愉快套板子了。

inline int calc(int x){ if(x<=M)return sumphi[x]; if(mp.find(x)!=mp.end())return mp[x]; int ans=S2(x); for(int l=2,r;l<=x;l=r+1){ r=x/(x/l); ans=(ans-((S1(r)-S1(l-1)+p)%p*calc(x/l)%p)%p+p)%p; } return mp[x]=ans; } inline int solve(){ int ans=0; for(int l=1,r;l<=n;l=r+1){ r=n/(n/l); ans=(ans+(calc(r)-calc(l-1)+p)%p*S2(n/l)%p)%p; } return ans; }

__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/17216521.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示