/*
An implementation of Sieve of Eratosthenes using a boolean array
Author: Nguyen Thanh Do
*/
let limit = parseInt(readline());
let notPrime = new Array(limit + 1).fill(false);
function markPrimes() {
notPrime[0] = notPrime[1] = true;
for (let num = 4; num <= limit; num += 2)
notPrime[num] = true;
for (let num = 3; num <= Math.sqrt(limit); num +=2) {
if (notPrime[num] === false) {
for (let mul = num * num; mul <= limit; mul += num * 2)
notPrime[mul] = true;
}
}
}
function printPrimes() {
let result = '';
for (let num = 0; num <= limit; num++) {
if (notPrime[num] === false)
result += (String(num) + ' ');
}
console.log(result);
}
markPrimes();
printPrimes();
LyoKQW4gaW1wbGVtZW50YXRpb24gb2YgU2lldmUgb2YgRXJhdG9zdGhlbmVzIHVzaW5nIGEgYm9vbGVhbiBhcnJheQpBdXRob3I6IE5ndXllbiBUaGFuaCBEbwoqLwoKbGV0IGxpbWl0ID0gcGFyc2VJbnQocmVhZGxpbmUoKSk7CmxldCBub3RQcmltZSA9IG5ldyBBcnJheShsaW1pdCArIDEpLmZpbGwoZmFsc2UpOwoKZnVuY3Rpb24gbWFya1ByaW1lcygpIHsKCW5vdFByaW1lWzBdID0gbm90UHJpbWVbMV0gPSB0cnVlOwoJCglmb3IgKGxldCBudW0gPSA0OyBudW0gPD0gbGltaXQ7IG51bSArPSAyKQoJCW5vdFByaW1lW251bV0gPSB0cnVlOwoKCWZvciAobGV0IG51bSA9IDM7IG51bSA8PSBNYXRoLnNxcnQobGltaXQpOyBudW0gKz0yKSB7CgkJaWYgKG5vdFByaW1lW251bV0gPT09IGZhbHNlKSB7CgkJCWZvciAobGV0IG11bCA9IG51bSAqIG51bTsgbXVsIDw9IGxpbWl0OyBtdWwgKz0gbnVtICogMikKCQkJCW5vdFByaW1lW211bF0gPSB0cnVlOwoJCX0KCX0KfQoKZnVuY3Rpb24gcHJpbnRQcmltZXMoKSB7CglsZXQgcmVzdWx0ID0gJyc7CgkKCWZvciAobGV0IG51bSA9IDA7IG51bSA8PSBsaW1pdDsgbnVtKyspIHsKCQlpZiAobm90UHJpbWVbbnVtXSA9PT0gZmFsc2UpCgkJCXJlc3VsdCArPSAoU3RyaW5nKG51bSkgKyAnICcpOwoJfQoKCWNvbnNvbGUubG9nKHJlc3VsdCk7Cn0KCm1hcmtQcmltZXMoKTsKcHJpbnRQcmltZXMoKTs=