莫比乌斯函数打表

来源:互联网 发布:企业级 选课系统 源码 编辑:程序博客网 时间:2024/05/17 21:39

莫比乌斯反演推荐博客:

莫比乌斯详解,莫比乌斯应用

莫比乌斯函数是莫比乌斯反演的核心

莫比乌斯函数打表

第一种

void getMu(){   //n*logn   递推筛法     for(int i=1; i<=MAXN; i++)     {         int target = i==1?1:0;         int delta = target - mu[i];         mu[i]=delta;         for(int j=i*2; j<=MAXN; j+=i)             mu[j]+=delta;     } }
第二种 

//线性筛法求莫比乌斯函数  bool check[MAXN+10];  int prime[MAXN+10];  int mu[MAXN+10];  void Moblus()  {      memset(check,false,sizeof(check));      mu[1] = 1;      int tot = 0;      for(int i = 2; i <= MAXN; i++)      {          if( !check[i] ){              prime[tot++] = i;              mu[i] = -1;          }          for(int j = 0; j < tot; j++)          {              if(i * prime[j] > MAXN) break;              check[i * prime[j]] = true;              if( i % prime[j] == 0){                  mu[i * prime[j]] = 0;                  break;              }else{                  mu[i * prime[j]] = -mu[i];              }          }      }  }


sum(d)=p|dμ(dp)

const int maxn = 10000010;int prime[maxn],mu[maxn],sum[maxn];bool check[maxn];void Mobius(){    memset(check,false,sizeof(check));    mu[1] = 1;    prime[0] = 0;   for(int i=2;i<maxn;i++){        if(!check[i]){            mu[i] = -1;            sum[i] = 1;            prime[++prime[0]] = i;        }        for(int j=1;j<=prime[0];j++){            if(i*prime[j] >= maxn)  break;            check[i*prime[j]] = true;            if(i % prime[j]){                mu[i*prime[j]] = -mu[i];                sum[i*prime[j]] = mu[i] - sum[i];            }            else{                mu[i*prime[j]] = 0;                sum[i*prime[j]] = mu[i];                break;            }        }    }}




原创粉丝点击