线性筛

学习链接:

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 }
原文地址:https://www.cnblogs.com/fzl194/p/9639522.html