因为莫比乌斯函数为
其中p是质因子
那么求解方法为:
1.直接求解:
ll miu(ll a)
{
ll x=a;
int cnt=0,now=0,k=0;
for(ll j=2;j*j<=x;j++)
{
now=0;
if(x%j==0){
while(x%j==0) now++,x/=j;//质因子i个数为now
if(now>1) return 0;//如果有两个及以上相同的质因子,不符合第二种情况,返回0
k++;//所有的质因子个数
}
}
if(x!=1) k++;//本身为质因子
return (k&1)?-1:1;//k为奇数还是偶数
}
打表
//线性筛法求莫比乌斯函数
bool check[MAX+10];
int prime[MAX+10];
int mu[MAX+10];
void Moblus()
{
memset(check,false,sizeof(check));
mu[1] = 1;
int tot = 0;
for(int i = 2; i <= MAX; i++)
{
if( !check[i] ){
prime[tot++] = i;
mu[i] = -1;
}
for(int j = 0; j < tot; j++)
{
if(i * prime[j] > MAX) break;
check[i * prime[j]] = true;
if( i % prime[j] == 0){
mu[i * prime[j]] = 0;
break;
}else{
mu[i * prime[j]] = -mu[i];
}
}
}
}