模板

莫比乌斯反演公式
莫比乌斯反演是一种通过公式简化运算的方法
如果需要求解的是\(f(n)\),可以找到另一个符合条件的函数\(F(n)\),通过反演公式计算出\(f(n)\)
莫比乌斯反演公式:

\[F(n)=\sum_{d|n}f(d)\Rightarrow f(n)=\sum_{d|n}\mu (d)F(\frac{n}{d}) \]

\[F(d)=\sum_{d|n}f(n)\Rightarrow f(d)=\sum_{d|n}\mu (\frac{n}{d})F(n) \]

莫比乌斯函数
莫比乌斯反演中的\(\mu(n)\)称为莫比乌斯函数
莫比乌斯函数的计算方法为:
1.若\(n\)可以被除1以外的完全平方数整除,\(\mu(n)=0\)
2.否则设\(n\)的质因数的个数为\(k\)\(\mu(n)=(-1)^k\)

由于整数分解可以在\(O(\sqrt n)\)的时间复杂度内完成,所以可以在\(O(\sqrt n)\)的时间复杂度内得到\(\mu (n)\)的值
也可以使用线性筛在\(O(n)\)的时间复杂度内得到\([1,n]\)中所有数的\(\mu\)

模板一:质因数分解求单个数的\(\mu\)

int get_mu(int n){
    int mu=1;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            mu*=-1;
            n/=i;
            if(n%i==0) return 0;
        }
    }
    if(n>1) mu*=-1;
    return mu;
}

模板二:线性筛求[1,n]中所有数的\(\mu\)

const int maxn=100010;
int is_prime[maxn],prime[maxn],cnt,mu[maxn];

void moebius(int n){
    mu[1]=1;
    for(int i=2;i<=n;i++){
        if(!is_prime[i]){
            prime[cnt++]=i;
            mu[i]=-1;
        }
        for(int j=0;j<cnt && i*prime[j]<=n;j++){
            is_prime[i*prime[j]]=1;
            if(i%prime[j]==0){
                mu[i*prime[j]]=0;
                break;
            }
            mu[i*prime[j]]=-mu[i];
        }
    }
}
posted @ 2020-07-27 00:24  fxq1304  阅读(65)  评论(0)    收藏  举报