筛法求莫比乌斯函数
唯一分解定理
\( 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];//否则等于素数的倍数
}
}
}

浙公网安备 33010602011771号