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

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

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

这两个式子是你首先要记住的。我们来看一道例题,这之后你可以学会DDZ重排,之后更多的内容就易如反掌了。以下的新内容都是DDZ重排。
【例题】求

i=1ngcd(i,n)

根据等式二变形,原式
=i=1nd|gcd(i,n)φd

我们知道,一个数是gcd(a,b)的因数,意味着它既整除a又整除b
那么,如果枚举d取遍1n的所有值(nd的最大可能值),然后在φd前面乘上满足的条件,也就是[d|i][d|j],不就一样了吗?
=i=1nd=1n[d|i][d|n]φd

显然,满足[d|n]=1的时候,dn的因数。因此我们先把它放到条件里面去。条件中两个都是常数,可以放到条件里。
=i=1nd|n[d|i]φd

我们发现d的枚举与i毫无关系,于是可以任意调换和号的位置。
=d|ni=1n[d|i]φd

因为是先枚举的d,因此在枚举i的时候,d相当于已经成为常数了。因此φd也是常数,我们可以把它提到外面去(乘法分配律)。
=d|nφdi=1n[d|i]

现在我们考察最后一个条件,d是确定的,要使id的倍数,i=1n[d|i]事实上就是求小于等于n的范围内d的倍数的个数。那不就直接除一下就是答案吗。
=d|nφdnd

学了DDZ重排,我们再来看由它得到的显然的几个结论。
重排变换 i=1nd|gcd(i,n)fd=d|nfdnd
混合重排变换 i=1nd|gcd(i,m)fd=d|mfdnd
扩展混合重排变换 i=1nd|gcd(i,m)fdgi=d|mfdi=1ndgid
其中第三个用到了扩展变换,如下
扩展变换 i=1n[d|i]fi=i=1ndfid

除此之外,还有一个新等式和两个重要的新变换
等式三 d|nμdd=φnn
收缩变换 i=1nd|ifd=i=1nd=1nifd
扩展变换和收缩变换都可以把枚举因数变成枚举前缀。注意扩展变换中变量是i,而收缩变换中变量是d
杜教筛变换 i=1nd|ifdgid=i=1ngid=1nifd
不能构造收缩变换的时候,可以构造一个gx,然后构造杜教筛变换。
上一篇博客讲了构造收缩变换,这里讲一道杜教筛变换。
【例题】求i=1nφii
我们要找一个与φii有关的式子。
如果只有φi的话,我们有d|nφd=n,然后套个前缀就可以收缩变换了。
构造杜教筛变换的要点是找到一个函数gnd,使与原来的fd乘起来可以套用公式。
这个i很烦,考虑把它吃掉。
于是构造式子

d|nφddnd=n2

为什么右边是n2应该比较显然吧。这里我们把nd当做gd,套一个前缀:
i=1nd|iφddid=i=1ni2

直接套杜教筛变换。(对照上面的式子看一下)
i=1nid=1niφdd=n(n+1)(2n+1)6

i=1niSni=n(n+1)(2n+1)6

Sn+i=2niSni=n(n+1)(2n+1)6

Sn=n(n+1)(2n+1)6i=2niSni

然后就杜教筛O(n23)求。


补充:约数个数变换:dnm=i|nj|m[gcd(i,j)=1] (SDOI2015)

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

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