分享:https://www.cnblogs.com/peng-ym/p/8647856.html
目录
一、莫比乌斯函数
1、定义
1.莫比乌斯函数μ(d)的定义是:
2.当d=1时,μ(d)=1;
3.当且pi为互异素数时,,说直白点,就是d分解质因数后,没有幂次大于平方的质因子,此时函数值根据分解的个数决定。
4.只要当d含有任何质因子的幂次大于等于2,则函数值为0
这里列出莫比乌斯函数的一些值
μ | value |
---|---|
1 | 1 |
2=(2) | -1 |
3=(3) | -1 |
4=(2*2) | 0 |
5=(5) | -1 |
6=(2*3) | 1 |
7=(7) | -1 |
8=(2*2*2) | 0 |
2、性质
1.如果n>1且n为正整数,则有: 如果n=1,则该式为1。(这一条性质是莫比乌斯反演中最常用的 )
2.对于任意正整数n均有: (将欧拉函数与莫比乌斯函数相结合)
3.μ(d)为积性函数,即满足gcd(a,b)=1,则μ(ab)=μ(a)*μ(b)。
3、代码实现
根据莫比乌斯函数的定义,用欧拉线性筛素数的方法。
void get_mu(int n)
{
int cnt=0,prime[maxn],vis[maxn],mu[maxn];
memset(vis,0,sizeof(vis));
memset(prime,0,sizeof(prime));
memset(mu,0,sizeof(mu));
mu[1]=1;vis[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt && prime[j]*i<=n;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)
{
mu[prime[j]*i]=0;
break;
}
mu[prime[j]*i]=-mu[i];
}
}
/*for(int i=1;i<51;i++)
printf("mu[%d]=%d\n",i,mu[i]);*/
}
二、莫比乌斯反演
若定义在正整数集上的两个函数,f(n)和F(n)满足对任意n有:
形式一:
形式二: