#include <iostream>
#include <vector>
using namespace std;
vector<int> primes_list;
template<typename T>
constexpr bool is_prime(T number, T limit, T counter)
{
return limit <= 1
? true
: counter >= limit && number % limit
? true
: number % counter
? is_prime(number, number / counter, counter + 1)
: false;
}
template<typename T>
constexpr bool is_prime(T n)
{
return n <= 1 ? false : is_prime(n, n / 2, T{2});
}
template<int N>
struct primes {
static void calc() {
primes<N - 1>::calc();
if (is_prime(N)) {
primes_list.push_back(N);
}
}
};
template<>
struct primes<2> {
static void calc() {
primes_list.push_back(2);
}
};
int main() {
primes<800>::calc();
for (int i = 0; i < primes_list.size(); ++i) {
cout << primes_list[i] << ' ';
}
cout << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdmVjdG9yPGludD4gcHJpbWVzX2xpc3Q7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjb25zdGV4cHIgYm9vbCBpc19wcmltZShUIG51bWJlciwgVCBsaW1pdCwgVCBjb3VudGVyKQp7CiAgICByZXR1cm4gbGltaXQgPD0gMQoJCQk/IHRydWUKCQkJOiBjb3VudGVyID49IGxpbWl0ICYmIG51bWJlciAlIGxpbWl0CgkJCQk/IHRydWUKCQkJCTogbnVtYmVyICUgY291bnRlcgoJCQkJCT8gaXNfcHJpbWUobnVtYmVyLCBudW1iZXIgLyBjb3VudGVyLCBjb3VudGVyICsgMSkKCQkJCQk6IGZhbHNlOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjb25zdGV4cHIgYm9vbCBpc19wcmltZShUIG4pCnsKCXJldHVybiBuIDw9IDEgPyBmYWxzZSA6IGlzX3ByaW1lKG4sIG4gLyAyLCBUezJ9KTsKfQoKdGVtcGxhdGU8aW50IE4+CnN0cnVjdCBwcmltZXMgewoJc3RhdGljIHZvaWQgY2FsYygpIHsKCQlwcmltZXM8TiAtIDE+OjpjYWxjKCk7CgoJCWlmIChpc19wcmltZShOKSkgewoJCQlwcmltZXNfbGlzdC5wdXNoX2JhY2soTik7CgkJfQoJfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgcHJpbWVzPDI+IHsKCXN0YXRpYyB2b2lkIGNhbGMoKSB7CgkJcHJpbWVzX2xpc3QucHVzaF9iYWNrKDIpOwoJfQp9OwoKaW50IG1haW4oKSB7CglwcmltZXM8ODAwPjo6Y2FsYygpOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWVzX2xpc3Quc2l6ZSgpOyArK2kpIHsKCQljb3V0IDw8IHByaW1lc19saXN0W2ldIDw8ICcgJzsKCX0KCgljb3V0IDw8ICdcbic7CgoJcmV0dXJuIDA7Cn0=