学习链接:https://www.cnblogs.com/peng-ym/p/8647856.html
莫比乌斯函数线性筛代码:
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]==0 18 } 19 } 20 }