/// Geoff Hagopian -- Sieve of Eratosthenes

#include <iostream>
#include <vector>
using namespace std;

void sieve(vector<bool>&);
void print(vector<bool>&);

constexpr unsigned int MAX = 100000;
int main() {
	vector<bool> isPrime(MAX, 1);
	sieve(isPrime);
	print(isPrime);
}

void sieve(vector<bool>& isPrime) {
	isPrime[0] = isPrime[1] = false;
	for (int i = 2; 2 * i < MAX; ++i) 
		isPrime[2 * i] = false;
	unsigned p = 3;
	while (p < sqrt(MAX)) {
		for (int j = 2; p * j < MAX; ++j)
			isPrime[p * j] = false;
		//do //++p;
		while (!isPrime[++p]);
	}
}

void print(vector<bool>& isPrime) {
	for (unsigned n = 0; n < MAX; ++n)
		if (isPrime[n] == true) cout << n << " ";
}