/* とりあえず篩を二重に生成しない版をば
   2の倍数は(2を除いて)省けるのでそこだけ工夫した
*/
#include <climits>
#include <cmath>
#include <iostream>

typedef unsigned int Integer;

const Integer MaxNumber = 10000;
const Integer IntegerSize = sizeof(Integer) * CHAR_BIT;
using std::cout;
using std::endl;

int main(void){
	// 篩の動的確保・初期化
	Integer ArraySize = static_cast<Integer>(MaxNumber / IntegerSize / 2) + 1;
	if(ArraySize * sizeof(Integer) * 2 != MaxNumber) ++ArraySize;
	Integer *SieveArray;
	SieveArray = new Integer[ArraySize];
	for(Integer i = 0; i < ArraySize; ++i)
		SieveArray[i] = 0;
	SieveArray[0] = 1;
	// 3～√nまでの整数について篩を掛ける
	Integer SqrtMaxNumber = static_cast<Integer>(sqrt(MaxNumber));
	if(SqrtMaxNumber * SqrtMaxNumber != MaxNumber) ++SqrtMaxNumber;
	for(Integer i = 3; i <= SqrtMaxNumber; i += 2){
		for(Integer j = 3; j <= MaxNumber / i; j += 2){
			Integer Position = (i * j - 1) / 2;
			Integer ArrayPosition = static_cast<Integer>(Position / IntegerSize);
			Integer BitPosition = Position - ArrayPosition * IntegerSize;
			SieveArray[ArrayPosition] |= 1 << BitPosition;
		}
	}
	// 結果表示
	cout << "2,";
	Integer Number = 1;
	for(Integer i = 0; i < ArraySize; ++i){
		Integer temp = SieveArray[i];
		for(Integer j = 0; j < IntegerSize; ++j){
			if(Number > MaxNumber) goto exit;
			if((temp & 1) == 0) cout << Number << ",";
			temp >>= 1;
			Number += 2;
		}
	}
exit:
	cout << endl;
	// 後処理
	delete [] SieveArray;
	return 0;
}
