有关莫比乌斯反演
对于两个定义域为整数的函数F(x)和f(x);
若有:
然后F(x)可以快速求出;
如何用F求解f呢?
莫比乌斯反演:
对于两个定义域为整数的函数F(x)和f(x);
若有:
则有:
其中μ(x)为莫比乌斯函数,其定义为:
对于(pi为质数)
若对于任意i存在ki>1,则μ(x)=0;
否则若质因子的个数为偶数,则μ(x)=1;
若质因子的个数为奇数,则μ(x)=-1;
有了这个定义之后;
为什么这是对的呢?
莫比乌斯函数有如下性质:
μ(1)=1;
证明:
观察上式,其含义为x的所有因子的μ和;
若x有重复质因子,则di可能有重复质因子,
但这样的话μ(di)为零;
把μ为0的部分放在一边;
剩下各自不含重复质因子的di了;
设x有k种质因子;
则设
显然,有
于是
多项式定理(杨辉三角)
带入x=-1,a=1,得证;
于是,莫比乌斯函数有了这样的性质:
这可以用来证明莫比乌斯反演;
即
证明:
发现:d的集合完全等于k的集合;
对于每一个k,考虑f(k)对答案的贡献;
发现在上式中;
当即
时
f(k)对答案贡献f(k)·μ(d)
于是:
由莫比乌斯函数的性质可知:
于是
得证;
莫比乌斯反演的另一种形式:
若有
则有
证明思路大同小异,省去;
莫比乌斯函数的求法:
莫比乌斯函数是积性函数(易证);
于是可线性筛求解;
代码如下:
void prime(){ int i,j; vis[1]=true;mob[1]=1; for(i=2;i<=MAXN;i++){ if(!vis[i]) pri[++cnt]=i,mob[i]=-1; for(j=1;j<=cnt&&pri[j]*i<=MAXN;j++){ vis[i*pri[j]]=true; if(i%pri[j]) mob[i*pri[j]]=-mob[i]; else{ mob[i*pri[j]]=0;break; } } } }
Just close your eyes, you`ll be alright, no one can hurt you after you die.