线性筛板子

线性筛筛素数:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e7;
 4 bool vis[maxn];
 5 int prime[maxn];
 6 int f(int n)//计算从1到n的素数个数
 7 {
 8     int cnt =0;
 9     memset(vis,false,sizeof(vis));
10     for(int i=2;i<=n;i++)
11     {
12         if(!vis[i])
13             prime[cnt++] = i;
14         for(int j=0;j<cnt && i*prime[j]<=n;j++)
15         {
16             vis[i*prime[j]]=1;
17             if(i%prime[j]==0)
18                 break;
19         }
20     }
21     return cnt;
22 }
23 /*当 i 能整除 prime[j]
24 那么 i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉。
25 因为i中含有prime[j], prime[j] 比 prime[j+1] 小。*/
26 
27 int main ()
28 {
29     int n;cin>>n;
30     cout<<f(n)<<endl;
31     return 0;
32 }
View Code

线性筛筛欧拉函数:

 1 void getxxs(int N){
 2     for(int i=2;i<=N;i++){
 3         v[i]=1;
 4     }
 5     for(int i=2;i<=N;i++){
 6         if(v[i]){
 7             prime[++num]=i;
 8             phi[i]=i-1;
 9         }
10         for(int j=1;i*prime[j]<=N&&j<=num;j++){
11             v[i*prime[j]]=0;
12             if(i%prime[j]==0){
13                 phi[i*prime[j]]=phi[i]*prime[j];
14                 break;
15             }else{
16                 phi[i*prime[j]]=phi[i]*(prime[j]-1);
17             }
18         }
19     }
20 }
View Code

线性筛筛莫比乌斯函数:

 1 getxxs(int N){
 2     for(int i=2;i<=N;i++){
 3         v[i]=1;
 4     }
 5     mu[1]=1;
 6     for(int i=2;i<=N;i++){
 7         if(v[i]){
 8             prime[++num]=i;
 9             mu[i]=-1;
10         }
11         for(int j=1;j<=num&&i*prime[j]<=N;j++){
12             v[i*prime[j]]=0;
13             if(i%prime[j]==0){
14                 mu[i*prime[j]]=0;
15                 break;
16             }else{
17                 mu[i*prime[j]]=-mu[i];
18             }
19         }
20     }
21 }
View Code

 

posted @ 2019-10-19 14:45  ljy3268  阅读(97)  评论(0编辑  收藏  举报