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 }