有关莫比乌斯反演

对于两个定义域为整数的函数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;
            }
        }
    }
}

 

posted @ 2017-05-07 19:32  F.W.Nietzsche  阅读(192)  评论(0编辑  收藏  举报