数论变换入门 莫比乌斯反演 杜教筛

版权声明:myjs999原创文章<br> https://blog.csdn.net/myjs999/article/details/78906549

也许你已经学习了莫比乌斯反演,但看到式子还是不会化对不对。
但是你不用管它,就当你没学过,先记住两个式子:
等式一 [n=1]=dnμd[n=1]=\sum_{d|n}\mu_d
等式二 n=dnφdn=\sum_{d|n}\varphi_d
那么容易发现这两个等式的意义,等式一可以把一个“判一”的式子化成可以计算的函数,等式二把一个数化到枚举范围里面去。
这么说不是很清楚,但一般来说我们都用以下的形式:
等式一变式 [gcd(a,b)=1]=dgcd(a,b)μd[\gcd(a,b)=1]=\sum_{d|\gcd(a,b)}\mu_d
等式二变式 gcd(a,b)=dgcd(a,b)φd\gcd(a,b)=\sum_{d|\gcd(a,b)}\varphi_d

这两个式子是你首先要记住的。我们来看一道例题,这之后你可以学会DDZ重排,之后更多的内容就易如反掌了。以下的新内容都是DDZ重排。
【例题】求i=1ngcd(i,n)\sum_{i=1}^n\gcd(i,n)
根据等式二变形,原式=i=1ndgcd(i,n)φd=\sum_{i=1}^n\sum_{d|\gcd(i,n)}\varphi_d
我们知道,一个数是gcd(a,b)\gcd(a,b)的因数,意味着它既整除aa又整除bb
那么,如果枚举dd取遍11nn的所有值(nndd的最大可能值),然后在φd\varphi_d前面乘上满足的条件,也就是[di][dj][d|i][d|j],不就一样了吗?
=i=1nd=1n[di][dn]φd=\sum_{i=1}^n\sum_{d=1}^n[d|i][d|n]\varphi_d
显然,满足[dn]=1[d|n]=1的时候,ddnn的因数。因此我们先把它放到条件里面去。条件中两个都是常数,可以放到条件里。
=i=1ndn[di]φd=\sum_{i=1}^n\sum_{d|n}[d|i]\varphi_d
我们发现dd的枚举与ii毫无关系,于是可以任意调换和号的位置。
=dni=1n[di]φd=\sum_{d|n}\sum_{i=1}^n[d|i]\varphi_d
因为是先枚举的dd,因此在枚举ii的时候,dd相当于已经成为常数了。因此φd\varphi_d也是常数,我们可以把它提到外面去(乘法分配律)。
=dnφdi=1n[di]=\sum_{d|n}\varphi_d\sum_{i=1}^n[d|i]
现在我们考察最后一个条件,dd是确定的,要使iidd的倍数,i=1n[di]\sum_{i=1}^n[d|i]事实上就是求小于等于nn的范围内dd的倍数的个数。那不就直接除一下就是答案吗。
=dnφdnd=\sum_{d|n}\varphi_d\lfloor\frac{n}{d}\rfloor

学了DDZ重排,我们再来看由它得到的显然的几个结论。
重排变换 i=1ndgcd(i,n)fd=dnfdnd\sum_{i=1}^n\sum_{d|\gcd(i,n)}f_d=\sum_{d|n}f_d\lfloor\frac{n}{d}\rfloor
混合重排变换 i=1ndgcd(i,m)fd=dmfdnd\sum_{i=1}^n\sum_{d|\gcd(i,m)}f_d=\sum_{d|m}f_d\lfloor\frac{n}{d}\rfloor
扩展混合重排变换 i=1ndgcd(i,m)fdgi=dmfdi=1ndgid\sum_{i=1}^n\sum_{d|\gcd(i,m)}f_dg_i=\sum_{d|m}f_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}g_{id}
其中第三个用到了扩展变换,如下
扩展变换 i=1n[di]fi=i=1ndfid\sum_{i=1}^n[d|i]f_i=\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f_{id}

除此之外,还有一个新等式和两个重要的新变换
等式三 dnμdd=φnn\sum_{d|n}\frac{\mu_d}{d}=\frac{\varphi_n}{n}
收缩变换 i=1ndifd=i=1nd=1nifd\sum_{i=1}^n\sum_{d|i}f_d=\sum_{i=1}^n\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}f_d
扩展变换和收缩变换都可以把枚举因数变成枚举前缀。注意扩展变换中变量是ii,而收缩变换中变量是dd
杜教筛变换 i=1ndifdgid=i=1ngid=1nifd\sum_{i=1}^n\sum_{d|i}f_dg_{\frac{i}{d}}=\sum_{i=1}^ng_i\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}f_d
不能构造收缩变换的时候,可以构造一个gxg_x,然后构造杜教筛变换。
上一篇博客讲了构造收缩变换,这里讲一道杜教筛变换。
【例题】求i=1nφii\sum_{i=1}^n\varphi_ii
我们要找一个与φii\varphi_ii有关的式子。
如果只有φi\varphi_i的话,我们有dnφd=n\sum_{d|n}\varphi_d=n,然后套个前缀就可以收缩变换了。
构造杜教筛变换的要点是找到一个函数gndg_\frac{n}{d},使与原来的fdf_d乘起来可以套用公式。
这个ii很烦,考虑把它吃掉。
于是构造式子dnφddnd=n2\sum_{d|n}\varphi_dd\frac{n}{d}=n^2
为什么右边是n2n^2应该比较显然吧。这里我们把nd\frac{n}{d}当做gdg_d,套一个前缀:
i=1ndiφddid=i=1ni2\sum_{i=1}^n\sum_{d|i}\varphi_dd\frac{i}{d}=\sum_{i=1}^ni^2
直接套杜教筛变换。(对照上面的式子看一下)
i=1nid=1niφdd=n(n+1)(2n+1)6\sum_{i=1}^ni\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}\varphi_dd=\frac{n(n+1)(2n+1)}{6}
i=1niSni=n(n+1)(2n+1)6\sum_{i=1}^niS_{\lfloor\frac{n}{i}\rfloor}=\frac{n(n+1)(2n+1)}{6}
Sn+i=2niSni=n(n+1)(2n+1)6S_n+\sum_{i=2}^niS_{\lfloor\frac{n}{i}\rfloor}=\frac{n(n+1)(2n+1)}{6}
Sn=n(n+1)(2n+1)6i=2niSniS_n=\frac{n(n+1)(2n+1)}{6}-\sum_{i=2}^niS_{\lfloor\frac{n}{i}\rfloor}
然后就杜教筛O(n23)O(n^\frac{2}{3})求。


补充:约数个数变换:dnm=injm[gcd(i,j)=1]d_{nm}=\sum_{i|n}\sum_{j|m}[\gcd(i,j)=1] (SDOI2015)
20180927补充:inμ(i)=0(n&gt;1)\sum_{i|n}\mu(i)=0(n&gt;1)

阅读更多

没有更多推荐了,返回首页