莫比乌斯反演0

时间:2022-05-08
本文章向大家介绍莫比乌斯反演0,主要内容包括弃坑、莫比乌斯函数、性质、莫比乌斯反演、证明、莫比乌斯函数的计算方法、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

弃坑

莫比乌斯函数

定义

设函数mu(n)为莫比乌斯函数

mu =begin{cases}left( -1right) ^{k}left( n=p_{1}p_{2}ldots p_{k}right) \ Oleft( exists P^{2}|nright) \ 1left( n=1right) end{cases}

性质

  • mu(n)为积性函数
  • sum _{d|n}mu left( dright) =left[ n=1right](非常重要!!)

莫比乌斯反演

公式

如果

gleft( nright) =sum _{d|n }fleft( dright)

那么

fleft( nright) =sum _{d|n}mu left( dright) gleft( dfrac {n}{d}right)

证明

sum _{d|n}mu left( dright) gleft( dfrac {n}{d}right)

=sum _{d|n}mu left( dfrac {n}{d}right) gleft( dright)

=sum _{d|n}mu left( dfrac {n}{d}right) sum _{k|d}fleft( kright)

=sum _{k|n}sum_{d|{dfrac{n}{k}}}mu(d)f(k)

=sum _{k|n}[dfrac{n}{k}=1]f(k)

=f(n)

莫比乌斯函数的计算方法

因为mu(n)为积性函数

那么可以利用线性筛来计算

#include<cstdio>
#include<cstring>
const int MAXN=1e6+10;
int prime[MAXN],mu[MAXN],vis[MAXN],tot,n;
void Euler()
{
    vis[1]=1;mu[1]=1; 
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])    prime[++tot]=i,mu[i]=-1;//只有一个质因子 
        for(int j=1;i*prime[j]<=n&&j<=tot;j++)
        {
            vis[ i*prime[j] ]=1;
            if(i%prime[j]==0)//i中包含prime[j] 
            {
                mu[ i*prime[j] ]=0;//乘起来之后肯定包含prime[j]^2 
                break; 
            }
            else mu[ i*prime[j] ]=-mu[i];//多了一个质因子 
        }
    }
}
int main()
{
    printf("Please input number:n");
    scanf("%d",&n);
    Euler();
    printf("%d",mu[n]);
    return 0;
}