mobius反演的mu函数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,mu[10002];
void init(){
scanf("%d",&n);
}


void mobius(int n){
bool vis[10002];
int cnt=0,prime[10002];
mu[1]=1;
memset(vis,0,sizeof(vis));
for (int i=2;i<=n;i++){
if (!vis[i]){ mu[i]=-1; prime[++cnt]=i; }
for (int j=0;prime[j]*i<=n&&j<cnt;j++){
vis[i*prime[j]]=1;
if (i%prime[j]) mu[i*prime[j]]=-mu[i];
else {  mu[i*prime[j]]=0;
       break;}


}
}
}


int main(){
init();
mobius(n);
for (int i=1;i<=n;i++) cout<<mu[i]<<endl;
return 0;
}

你可能感兴趣的:(mobius反演的mu函数)