/*
An implementation of Sieve of Eratosthenes using a bit array
Author: Nguyen Thanh Do
*/
let limit = parseInt(readline());
let marked = new Uint8Array(limit / 8 + 1).fill(0);
const masks = [1, 2, 4, 8, 16, 32, 64, 128];
function markNotPrime(num) {
let idx = Math.floor(num / 8);
marked[idx] |= masks[num % 8];
}
function isNotPrime(num) {
let idx = Math.floor(num / 8);
return marked[idx] & masks[num % 8];
}
function markNumbers() {
markNotPrime(0);
markNotPrime(1);
for (let num = 4; num <= limit; num += 2)
markNotPrime(num);
for (let num = 3; num <= Math.sqrt(limit); num++) {
if (isNotPrime(num) === 0) {
for (let mul = num * num; mul <= limit; mul += num * 2)
markNotPrime(mul);
}
}
}
function printPrimes() {
let result = '';
for (let num = 0; num <= limit; num++) {
if (isNotPrime(num) === 0)
result += (String(num) + ' ');
}
console.log(result);
}
markNumbers();
printPrimes();
LyoKQW4gaW1wbGVtZW50YXRpb24gb2YgU2lldmUgb2YgRXJhdG9zdGhlbmVzIHVzaW5nIGEgYml0IGFycmF5CkF1dGhvcjogTmd1eWVuIFRoYW5oIERvCiovCgpsZXQgbGltaXQgPSBwYXJzZUludChyZWFkbGluZSgpKTsKbGV0IG1hcmtlZCA9IG5ldyBVaW50OEFycmF5KGxpbWl0IC8gOCArIDEpLmZpbGwoMCk7CmNvbnN0IG1hc2tzID0gWzEsIDIsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOF07CgpmdW5jdGlvbiBtYXJrTm90UHJpbWUobnVtKSB7CglsZXQgaWR4ID0gTWF0aC5mbG9vcihudW0gLyA4KTsKCW1hcmtlZFtpZHhdIHw9IG1hc2tzW251bSAlIDhdOwp9CgpmdW5jdGlvbiBpc05vdFByaW1lKG51bSkgewoJbGV0IGlkeCA9IE1hdGguZmxvb3IobnVtIC8gOCk7CglyZXR1cm4gbWFya2VkW2lkeF0gJiBtYXNrc1tudW0gJSA4XTsKfQoKZnVuY3Rpb24gbWFya051bWJlcnMoKSB7CgltYXJrTm90UHJpbWUoMCk7CgltYXJrTm90UHJpbWUoMSk7CgoJZm9yIChsZXQgbnVtID0gNDsgbnVtIDw9IGxpbWl0OyBudW0gKz0gMikKCQltYXJrTm90UHJpbWUobnVtKTsKCglmb3IgKGxldCBudW0gPSAzOyBudW0gPD0gTWF0aC5zcXJ0KGxpbWl0KTsgbnVtKyspIHsKCQlpZiAoaXNOb3RQcmltZShudW0pID09PSAwKSB7CgkJCWZvciAobGV0IG11bCA9IG51bSAqIG51bTsgbXVsIDw9IGxpbWl0OyBtdWwgKz0gbnVtICogMikKCQkJCW1hcmtOb3RQcmltZShtdWwpOwoJCX0KCX0KfQoKZnVuY3Rpb24gcHJpbnRQcmltZXMoKSB7CglsZXQgcmVzdWx0ID0gJyc7CgkKCWZvciAobGV0IG51bSA9IDA7IG51bSA8PSBsaW1pdDsgbnVtKyspIHsKCQlpZiAoaXNOb3RQcmltZShudW0pID09PSAwKQoJCQlyZXN1bHQgKz0gKFN0cmluZyhudW0pICsgJyAnKTsKCX0KCgljb25zb2xlLmxvZyhyZXN1bHQpOwp9CgptYXJrTnVtYmVycygpOwpwcmludFByaW1lcygpOw==