筛法求莫比乌斯函数

唯一分解定理

\( n=p{1}^{a_1}p{2}^{a_2}p{3}^{a_3}···p{s}^{a_s} \),

莫比乌斯函数的定义

\( \mu(n)= \left\{ \begin{matrix} & 1 & & n=1 \\\ & 0 & & n含相同质因子次数大于2 \\\ & (-1)^s & & s为n的不同质因子个数 \end{matrix} \right. \)

例:
\(\mu \{1\}=1(n=1)\),
\(\mu \{4,8,9,12\}=0(n含相同质因子次数大于2)\),
\(\mu \{2,3,5,30,70\}=-1(不同质因子为奇数个数)\),
\(\mu \{6,10,15\}=1(不同质因子为偶数个数)\),

筛法求莫比乌斯函数

埃氏筛法

首先将mu[i]初始化为1
在埃氏筛中筛出素数都成为不同质因子的其中1个,也就是奇数个数,
所以素数都被标记为mu[i]=-1;
所有素数的倍数做单独处理;
如果都能整除质数i*i,那么质因子次数一定大于2,所以结果直接为0;
否则结果就等于他的倒数;

void getmu(int n)
{
    for(int i=1;i <= n;i++)  mu[i]=1, vis[i];//首先设置所有小于n的mu都为1
    for(int i=2;i <= n;i++)
    {
        if(vis[i])  continue; //被访问过,已处理,跳过
        mu[i] = -1;    //i没有被访问,说明i是素数
        for(int j = 2*i; j <= n;j += i) //筛出所有素数倍数
        {
            vis[j] = 1;
            if(j % (i*i) == 0)  mu[j] = 0;  //含相同质因子次数大于2,结果直接为0
            else  mu[j] *= -1;//否则等于他的倒数
        }
    }
}

欧拉筛法

void get_mu(int n){
  mu[1] = 1;
  for(int i=2; i<=n; i++){
    if(!vis[i]){
      p[++cnt] = i;
      mu[i] = -1;//i没有被访问,说明i是素数
    }
    for(int j=1; i*p[j]<=n; j++){
      int m = i*p[j]; //所有素数倍数
      vis[m] = 1;
      if(i%p[j] == 0){//i再次能整除对应素数
        mu[m] = 0; 
        break;
      } 
      else
        mu[m] = -mu[i];//否则等于素数的倍数
    }
  }
}
posted @ 2023-02-06 11:36  钦泽爸爸  阅读(122)  评论(0)    收藏  举报