莫比乌斯函数线性筛代码:
1 bool not_prime[maxn]; 2 int prime[maxn]; 3 int Mob[maxn]; 4 void Mobius_sieve(int n) 5 { 6 int tot = 0; 7 not_prime[1] = 1; 8 Mob[1] = 1; 9 for(int i = 2; i <= n; i++)10 {11 if(!not_prime[i])prime[tot++] = i, Mob[i] = - 1;12 for(int j = 0; j < tot && 1LL * prime[j] * i <= n; j++)13 {14 not_prime[prime[j] * i] = 1;//每个合数x由它最小素因子prime[j]筛掉15 Mob[i * prime[j]] = (i % prime[j] ? -Mob[i]: 0);16 if(i % prime[j] == 0)break;//如果i % prime[j] == 0,不停止循环17 //那么接下来将用prime[j+1]筛去i*prime[j+1],但实际上应该用prime[i]筛去,因为i%prime[j]==018 }19 }20 }