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 }