版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
我们定义莫比乌斯函数:
求1~n的莫比乌斯函数值:
vector<int> prime;
bool check[maxn+5];
int um[maxn+5]
void Mobius()
{
mu[1] = 1;
for (int i = 2; i <= maxn; i++)
{
if( !check[i] )
{
prime.push_back(i);
um[i] = -1; //质数的莫比乌斯值为-1
}
for (int j = 0; j < prime.size(); j++)
{
if( i * prime[j] > maxn ) break;
check[i*prime[j]] = true;
if( i % prime[j] == 0 )
{
um[i*prime[j]] = 0; //素因子分解后有prime[j]的指数大于1
break;
}else mu[i*prime[j]] = -mu[i]; //有一个新的素因子,且指数为1,乘-1
}
}
}
莫比乌斯反演: