#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
#include <cassert>
auto sieve(int limit) {
std::vector<bool> primes_lookup(limit);
// kod z neta
unsigned long long int i,j;
for (i=2;i<limit;i++)
primes_lookup[i]=1;
for (i=2;i<limit;i++)
if (primes_lookup[i])
for (j=i;i*j<limit;j++)
primes_lookup[i*j]=0;
return primes_lookup;
}
template<typename Cont>
auto extract_primes(Cont const &primes_lookup) {
std::vector<int> result;
for (int i = 0; i < primes_lookup.size(); ++i) {
if (primes_lookup[i]) {
result.push_back(i);
}
}
return result;
}
template<typename Cont>
auto calc_factors(Cont const &primes, int num) {
std::vector<int> result;
for (int i = 0; i < primes.size() && primes[i] <= num;) {
if (num % primes[i]) {
i += 1;
continue;
} else {
result.push_back(primes[i]);
num /= primes[i];
}
}
return result;
}
int main() {
auto const primes = extract_primes(
sieve(100000)
);
auto calc_factors = [&primes](int num) {
return ::calc_factors(primes, num);
};
// a spróbuj tylko pchać jakieś factorsy które nie są posortowane i które nie są l. pierwszymi
auto condition = [&primes](auto factors) -> bool {
if (!factors.size()) return false;
auto last = std::unique(std::begin(factors), std::end(factors));
return std::equal(
std::begin(factors),
last,
std::find(std::begin(primes), std::end(primes), factors[0])
);
};
for(int num = 0; std::cin >> num;) {
auto factors = calc_factors(num);
std::cout
<< (condition(factors)? "warunek spelnia " : "warunku nie spelnia ")
<< num
<< " -> ";
for(auto el: factors) std::cout << el << " ";
std::cout << std::endl;
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKYXV0byBzaWV2ZShpbnQgbGltaXQpIHsKCXN0ZDo6dmVjdG9yPGJvb2w+IHByaW1lc19sb29rdXAobGltaXQpOwoJLy8ga29kIHogbmV0YQoJdW5zaWduZWQgbG9uZyBsb25nIGludCBpLGo7CgkKICAgIGZvciAoaT0yO2k8bGltaXQ7aSsrKQogICAgCXByaW1lc19sb29rdXBbaV09MTsKICAgIAkKICAgIGZvciAoaT0yO2k8bGltaXQ7aSsrKQogICAgCWlmIChwcmltZXNfbG9va3VwW2ldKQogICAgICAgICAgICBmb3IgKGo9aTtpKmo8bGltaXQ7aisrKQogICAgICAgICAgICAgICAgcHJpbWVzX2xvb2t1cFtpKmpdPTA7CiAgICAgICAgCglyZXR1cm4gcHJpbWVzX2xvb2t1cDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgQ29udD4KYXV0byBleHRyYWN0X3ByaW1lcyhDb250IGNvbnN0ICZwcmltZXNfbG9va3VwKSB7CglzdGQ6OnZlY3RvcjxpbnQ+IHJlc3VsdDsKCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWVzX2xvb2t1cC5zaXplKCk7ICsraSkgewoJCWlmIChwcmltZXNfbG9va3VwW2ldKSB7CgkJCXJlc3VsdC5wdXNoX2JhY2soaSk7CgkJfQoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgQ29udD4KYXV0byBjYWxjX2ZhY3RvcnMoQ29udCBjb25zdCAmcHJpbWVzLCBpbnQgbnVtKSB7CglzdGQ6OnZlY3RvcjxpbnQ+IHJlc3VsdDsKCQoJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltZXMuc2l6ZSgpICYmIHByaW1lc1tpXSA8PSBudW07KSB7CgkJaWYgKG51bSAlIHByaW1lc1tpXSkgewoJCQlpICs9IDE7CgkJCWNvbnRpbnVlOwoJCX0gZWxzZSB7CgkJCXJlc3VsdC5wdXNoX2JhY2socHJpbWVzW2ldKTsKCQkJbnVtIC89IHByaW1lc1tpXTsKCQl9Cgl9CglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKCWF1dG8gY29uc3QgcHJpbWVzID0gZXh0cmFjdF9wcmltZXMoCgkJc2lldmUoMTAwMDAwKQoJKTsKCglhdXRvIGNhbGNfZmFjdG9ycyA9IFsmcHJpbWVzXShpbnQgbnVtKSB7CgkJcmV0dXJuIDo6Y2FsY19mYWN0b3JzKHByaW1lcywgbnVtKTsKCX07CgkKCS8vIGEgc3Byw7NidWogdHlsa28gcGNoYcSHIGpha2llxZsgZmFjdG9yc3kga3TDs3JlIG5pZSBzxIUgcG9zb3J0b3dhbmUgaSBrdMOzcmUgbmllIHPEhSBsLiBwaWVyd3N6eW1pCglhdXRvIGNvbmRpdGlvbiA9IFsmcHJpbWVzXShhdXRvIGZhY3RvcnMpIC0+IGJvb2wgewoJCWlmICghZmFjdG9ycy5zaXplKCkpIHJldHVybiBmYWxzZTsKCQkKCQlhdXRvIGxhc3QgPSBzdGQ6OnVuaXF1ZShzdGQ6OmJlZ2luKGZhY3RvcnMpLCBzdGQ6OmVuZChmYWN0b3JzKSk7CgkJcmV0dXJuIHN0ZDo6ZXF1YWwoCgkJCXN0ZDo6YmVnaW4oZmFjdG9ycyksCgkJCWxhc3QsCgkJCXN0ZDo6ZmluZChzdGQ6OmJlZ2luKHByaW1lcyksIHN0ZDo6ZW5kKHByaW1lcyksIGZhY3RvcnNbMF0pCgkJKTsKCX07CgkKCWZvcihpbnQgbnVtID0gMDsgc3RkOjpjaW4gPj4gbnVtOykgewoJCWF1dG8gZmFjdG9ycyA9IGNhbGNfZmFjdG9ycyhudW0pOwoJCXN0ZDo6Y291dAoJCQk8PCAoY29uZGl0aW9uKGZhY3RvcnMpPyAid2FydW5layBzcGVsbmlhICIgOiAid2FydW5rdSBuaWUgc3BlbG5pYSAiKQoJCQk8PCBudW0KCQkJPDwgIiAtPiAiOwoKCQlmb3IoYXV0byBlbDogZmFjdG9ycykgc3RkOjpjb3V0IDw8IGVsIDw8ICIgIjsKCgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCX0KCXJldHVybiAwOwp9Cg==