莫比乌斯函数:
设 ,其中 p为素数,则定义如下:
线性筛求莫比乌斯函数:
#include<bits/stdc++.h>
using namespace std;
int mu[120000],vis[120000],prime[120000],cnt;
void mbws(int n)
{
mu[1] = 1;
cnt = 0;
for(int i = 2; i < n; i++)
{
if(!vis[i])
{
prime[cnt++] = i;
mu[i] = -1; //质数显然k=1
}
for(int j = 0; j < cnt && prime[j]*i < n; j++)
{
vis[prime[j]*i] = 1;
if(i%prime[j] == 0)
break;
mu[i*prime[j]] = -mu[i]; //由于欧拉筛中,每个数只会被最小的质因子筛到一次,相当于这个数多了一个因子p[j],就相当于-mu[i](可以通过分类讨论理解)。
}
}
}
int main()
{
int sum = 0;
mbws(1200);
for(int i = 1; i <= 120; i++)
{
printf("%d\n",mu[i]);
}
return 0;
}
莫比乌斯反演:
若
则
或者
若
则