[算法模板]莫比乌斯反演

莫比乌斯反演

先安利一下隔壁lsj大佬的博客:lsj-莫比乌斯反演-让我们从基础开始

在lsj大佬的博客里有一个比较重要的公式证明:

\(d(ij)=\displaystyle\sum_{x\mid i}\sum_{y\mid j}[gcd(x,y)=1]\)

莫比乌斯函数

\[\mu(u)=\left\{\begin{split} &1&\ \text{若}n=1\\ &(-1)^k&\ \text{若}n\text{无平方因子数,且}n=p_1p_2\cdots p_k\\ &0&\ \text{若}n\text{有大于1的平方因数} \end{split}\right. \]

\(\mu\)函数性质:\(\displaystyle\sum _{d\mid n} \mu(d)=[n=1]\)

\(\phi\)函数性质:\(\displaystyle\sum _{d\mid n}\phi (d)=n\)

显然:

\(\displaystyle\sum _{d\mid gcd(i,j) } \mu(d)=[gcd(i,j)=1]\)

\(\displaystyle\sum _{d\mid gcd(i,j)}\phi (d)=gcd(i,j)\)

筛法

莫比乌斯函数可以用线性筛筛出

代码引自litble-初涉莫比乌斯反演(附带例题)

void init(){
    miu[1]=1;
    for(int i=2;i<=100000;i++){
        if(!is[i]){pri[++tot]=i;miu[i]=-1;}
        for(int j=1;j<=tot;j++){
            int k=pri[j]*i;if(k>100000)break;
            is[k]=1;
            if(i%pri[j]==0){miu[k]=0;break;}
            else miu[k]=-miu[i];
        }
    }
}

posted @ 2019-06-27 16:41  GavinZheng  阅读(400)  评论(0编辑  收藏  举报