//エラトステネスのふるい改良版

#include <stdio.h>

#define MAX 1000

int main()
{
    int i,j;
    //エラトステネスのふるい用配列。
    //true なら素数。
    //偶数は明らかに素数でないので最初から排除。
    //2も素数として排除。
    //(MAX+1)個の配列で3〜(2*MAX+3) までの素数に対応
        
    bool Prime[MAX+1];
    
    for(i=0;i<=MAX;i++){//初期化
        Prime[i] = true;
    }

    
    int k;//添え字
    int prm;//添え字に対応する素数

    //添え字k <-> 素数prm の変換式は
    //(2*k+3) <-> prm

    for(i=0; i<=MAX; i++){//i=0からi=MAXまで
        if(Prime[i] == true){
            prm = 2*i+3;//添え字iに対応する素数
            for(k=i+prm; k<=MAX; k+=prm){
            //エラトステネスの超重要ポイント
            //for(j=prm*3,k=(j-3)/2;k<=MAX;j+=2*prm,k=(j-3)/2)と同じ
            //倍数(j+2*prm)を除いていく。偶数はすっ飛ばしてる事に注意。
                Prime[k] = false;//倍数は素数から除外
            }
        }
    }
    
    //合ってるかどうか表示
    printf("%d ",2);//2は無条件で素数としたため。
    for(i=0;i<=MAX;i++){
        if(Prime[i]){
            printf("%d ",2*i+3);
        }
    }
    return 0;
}