线性筛模板

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 const int N=1e5+10;
 6 int Min[N],zs[N],cnt=0,n,phi[N];
 7 void prime(int n){
 8     memset(Min,0,sizeof(Min));
 9     for(int i=2;i<=n;i++){
10         if(Min[i]==0){
11             Min[i]=i;//自己是自己的最小质数 
12 //            phi[i]=i-1;
13             zs[++cnt]=i;
14         }
15         for(int j=1;j<=cnt;j++){//当前质数*小于等于自己的质数来筛合数(当然别筛过了) 
16             if(Min[i]<zs[j]||zs[j]>n/i){//当前i的最小质因数比自己小或乘出来会越界 
17 //                phi[i*zs[j]]=phi[i]*zs[j];//说明phi[i*zs[j]]时定会有不止一个zs[j],欧拉函数顺手乘上这个质数就好 
18                 break;
19             }
20 //            phi[zs[j]*i]=phi[i]*(zs[j]-1);//若这个质数j与i互质,则phi[i*zs[j]]=phi[i]*phi[zs[j]]=phi[i]*(zs[j]-1) 
21             Min[zs[j]*i]=zs[j];//乘出来的合数最小值肯定为小于等于自己的那个质数
22         }
23     }
24     for(int i=1;i<=cnt;i++)
25         printf("%d ",zs[i]);//打印质数 
26 }
27 int main(){
28     scanf("%d",&n);
29     prime(n);
30     return 0;
31 }

 

posted @ 2018-09-05 21:38  saionjisekai  阅读(128)  评论(0编辑  收藏  举报