线性筛
Posted fzl194
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性筛相关的知识,希望对你有一定的参考价值。
学习链接:
https://www.cnblogs.com/Paul-Guderian/p/7723031.html
素数的线性筛:
1 bool not_prime[maxn]; 2 int prime[maxn]; 3 int Prime_sieve(int n) 4 { 5 int tot = 0; 6 not_prime[1] = 1; 7 for(int i = 1; i <= n; i++) 8 { 9 if(!not_prime[i])prime[tot++] = i; 10 for(int j = 0; j < tot && 1LL * prime[j] * i <= n; j++) 11 { 12 not_prime[prime[j] * i] = 1;//每个合数x由它最小素因子prime[j]筛掉 13 if(i % prime[j] == 0)break;//如果i % prime[j] == 0,不停止循环 14 //那么接下来将用prime[j+1]筛去i*prime[j+1],但实际上应该用prime[i]筛去,因为i%prime[j]==0 15 } 16 } 17 return tot; 18 }
欧拉函数的线性筛
1 bool not_prime[maxn]; 2 int prime[maxn]; 3 int phi[maxn]; 4 void phi_sieve(int n) 5 { 6 int tot = 0; 7 not_prime[1] = 1; 8 phi[1] = 1; 9 for(int i = 2; i <= n; i++) 10 { 11 if(!not_prime[i])prime[tot++] = i, phi[i] = 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 phi[i * prime[j]] = phi[i] * (i % prime[j] ? prime[j] - 1 : prime[j]); 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 }
莫比乌斯函数的线性筛
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 }
以上是关于线性筛的主要内容,如果未能解决你的问题,请参考以下文章