莫比乌斯反演是数论中非常重要的一部分,它可以将一个本来只能用时间复杂度极高的枚举求和过程,通过反演变成一个线性时间复杂度甚至根号级别的时间复杂度的问题。在这里,总结一下本人在学习莫比乌斯反演(附带一部分欧拉反演)时的经验和技巧。
在说反演之前先说一个大多数反演问题都能用到的部分——整除分块
什么是整除分块?举个例子,求$sumlimits_{i=1}^{n}ileft lfloor frac{n}{i} ight floor$,如果暴力枚举要O(n)的时间复杂度,但可以发现对于不同的i,有许多$left lfloor frac{n}{i} ight floor$ 是相等的,而$left lfloor frac{n}{i} ight floor$只有√n种取值。因此可以把取值相同的i分成同一块,求每一块值时只要将这一段的i之和用前缀和处理出来乘上对应的$left lfloor frac{n}{i} ight floor$就好了,时间复杂度降到了根号级别。
代码很简短
int add(int n) { int ans=0; int r; for(int l=1;l<=n;l=r+1) { r=n/(n/l); ans+=(sum[r]-sum[l-1])*(n/l); } }
两个整除分块套在一起的也是同样的
int add(int n,int m) { int ans=0; int r; if(n>m) { swap(n,m); } for(int l=1;l<=n;l=r+1) { r=min(n/(n/l),m/(m/l)); ans+=(sum[r]-sum[l-1])*(n/l)*(m/l); } return ans; }
一、欧拉反演
欧拉反演不怎么实用,但在做某些题时要比莫比乌斯反演要简便。对于一些求权值和的反演题比较合适。核心公式是$n=sumlimits_{d|n}^{ }phi(d)$。
证明:我们把1~n所有数按与n的gcd分类,
$n=sumlimits_{d|n}^{ }sumlimits_{i=1}^{n}[gcd(i,n)==d]$
$n=sumlimits_{d|n}^{ }sumlimits_{i=1}^{frac{n}{d}}[gcd(i,frac{n}{d})==1]$
$n=sumlimits_{d|n}^{ }phi(frac{n}{d})$
因为一个数的约数是"对称"的,所以
$n=sumlimits_{d|n}^{ }phi(d)$
知道了公式怎么反演呢?欧拉反演的原理就是把一些式子里求的值,强行换成$sumlimits_{d|x}^{ }phi(d)$形式,其中x就是要求的值。
具体怎么实现呢?举个例子:
求$sumlimits_{i=1}^{n}gcd(i,n)$
求的是所有gcd的值,那么我们可以把gcd(i,n)看成是公式里的n,反演后就是
$sumlimits_{i=1}^{n}sumlimits_{d|gcd(i,n)}^{ }phi(d)$
继续推导能得到
$sumlimits_{i=1}^{n}sumlimits_{d|i}^{ }sumlimits_{d|n}^{ }phi(d)$
$sumlimits_{d|n}^{ }sumlimits_{i=1}^{n}sumlimits_{d|i}^{ }phi(d)$
对于每个d,在n的范围内只对n/d个数有贡献,因此得到
$sumlimits_{d|n}^{ }frac{n}{d}phi(d)$
这样只要O(√n)枚举约数求欧拉函数就好了。
欧拉反演部分就这么多,虽然不适用于所有反演题,但有时如果用莫比乌斯反演不太容易可以试试欧拉反演。
二、莫比乌斯反演
莫比乌斯反演适用于几乎所有反演题,用于做一些求成立方案数的题,对于求权值和的题可以转化成求方案数一类的问题再进行反演。莫比乌斯反演的核心公式是
$sumlimits_{d|n}^{ }mu(d)=epsilon(n),epsilon(n)=1,n=1;epsilon(n)=0,n eq1$
证明:
将n质因数分解可得n=p1a1p2a2……pkak,由莫比乌斯函数定义可知,非零取值的μ(d)只有d=p1a1p2a2……pkak,其中ai取值为1或0,也就是所有质因子的组合数,即
$(x+y)^k=sumlimits_{i=0}^{k}C_{k}^{k-i}x^iy^{k-i}$没错,就是二项式定理! 其中x代表选这个质因子,y代表不选。因为选了奇数个值为-1,偶数个值为1,没选的数对结果没影响,所以x=-1,y=1,x+y=0,这时要讨论n是否为1,如果不为1,那么结果就是0了!
莫比乌斯反演的原理就是把原式中判断是否等于1的部分换成$sumlimits_{d|x}^{ }mu(d)$ 形式,其中x为原式中判断是否等于1的部分。因为刚才证明了,只有当x=1时才有贡献,与判断是否等于1效果相同。
在举例子之前再介绍一个十分有用的公式
$phi(n)=sumlimits_{d|n}^{ }d*mu(frac{n}{d})$
怎么来的呢?我们设$f(n)=n,g(n)=1,h(n)=phi(n)$,
$h(n)*g(n)=sumlimits_{d|n}^{ }phi(d)=n=f(n)$其中$*$代表狄利克雷卷积
将等式两边同时卷上μ(n)
$h(n)*g(n)*mu(n)=f(n)*mu(n)$
因为卷积有结合律和交换律
$h(n)*(g(n)*mu(n))=f(n)*mu(n)$
将合并的卷积展开得到
$h(n)*(sumlimits_{d|n}^{ }mu(d))=sumlimits_{d|n}^{ }dcdot mu(frac{n}{d})$
即
$h(n)*epsilon(n)=sumlimits_{d|n}^{ }dcdot mu(frac{n}{d})$
再合并得到
$sumlimits_{d|n}^{ }epsilon(d)cdotphi(frac{n}{d})=sumlimits_{d|n}^{ }dcdot mu(frac{n}{d})$
因为当d为1时$epsilon(d)$才有贡献,这时n/d为n左边即为$phi(n)$,右边就是上面公式里给出的部分。
下面正式开始莫比乌斯反演!
求$sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}gcd(i,j)$
显然这是一个求权值和的题,但可以转化成判断是否成立。
我们设gcd(i,j)=d,优先枚举d,判断哪些(i,j)的gcd等于d,为了方便假设n<m
$sumlimits_{d=1}^{n}dsumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)==d]$
因为i与j一定要是d的倍数,所以可以把i,j都除去d,转换为判断除去后的i,j是否互质
$sumlimits_{d=1}^{n}dsumlimits_{i=1}^{left lfloor frac{n}{d} ight floor}sumlimits_{j=1}^{left lfloor frac{m}{d} ight floor}[gcd(i,j)==1]$
这样就可以莫比乌斯反演了!按照上面说的反演套路把后面的部分换掉。
$sumlimits_{d=1}^{n}dsumlimits_{i=1}^{left lfloor frac{n}{d} ight floor}sumlimits_{j=1}^{left lfloor frac{m}{d} ight floor}sumlimits_{p|gcd(i,j)}^{ }mu(p)$
优先枚举p,即统计每个p对多少对数有贡献
$sumlimits_{d=1}^{n}dsumlimits_{p=1}^{left lfloor frac{n}{d} ight floor}mu(p)left lfloor frac{n}{dp} ight floorleft lfloor frac{m}{dp} ight floor$
当反演时,见到dp就把它换成Q,将前面的枚举d和p换成枚举Q统计每个Q的贡献
$sumlimits_{Q=1}^{n}sumlimits_{d|n}^{ }dcdotmu(frac{Q}{d})left lfloor frac{n}{Q} ight floorleft lfloor frac{m}{Q} ight floor$
中间那部分是不是很熟悉?没错,就是上面讲的公式。
$sumlimits_{Q=1}^{n}phi(Q)left lfloor frac{n}{Q} ight floorleft lfloor frac{m}{Q} ight floor$
直接线筛欧拉函数然后整除分块就好了!
莫比乌斯反演的过程大致就是这样的,当然还有些题会筛一个卷积形式的积性函数,用筛积性函数的套路筛就好了。积性函数的线性筛可参见->线性筛法