莫比乌斯函数模版

   比较优秀的线性筛

    

int prime[maxn];
int mu[maxn];
void init(){
  int M=maxn;
  memset(prime,0,sizeof(prime));
  memset(mu,0,sizeof(mu));
  memset(vis,0,sizeof(vis));
  mu[1]=1;
  int cnt=1;
  for (int i=2;i<maxn;i++){
    if (!vis[i]){//质数
        prime[cnt++]=i;
        mu[i]=-1;//质数的mobius为-1
    }
    for (int j=1;j<cnt && i*prime[j]<maxn ;j++){
        vis[i*prime[j]]=1;//筛掉
        if (i%prime[j])mu[i*prime[j]]=-mu[i];
        else {
            mu[i*prime[j]]=0;
            break;
        }
    }
  }
}

  比较垃圾的普通筛法

void init(){
  int M=maxn;
  memset(prime,0,sizeof(prime));
  memset(mu,0,sizeof(mu));
  memset(vis,0,sizeof(vis));
  mu[1]=1;
  int cnt=0;
  for (int i=1;i<maxn-1;i++){
    mu[i]=1;
    vis[i]=0;
  }
  for (int i=2;i<maxn;i++){
    if (vis[i])continue;
    mu[i]=-1;
    for (int j=2*i;j<maxn;j+=i){
        vis[j]=1;
        if ((j/i)%i==0)mu[j]=0;
        else mu[j]*=-1;
    }
  }
}

猜你喜欢

转载自www.cnblogs.com/bluefly-hrbust/p/10596620.html