#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
template <class T> struct GetMax { public: static T const Value; };
template <class T> T const GetMax<T>::Value = string("Not supported!");
template <> int const GetMax<int>::Value = 0x7FFFFFFF;
template <> unsigned int const GetMax<unsigned int>::Value = 0xFFFFFFFFU;
template <class T>
class PrimesHelper
{
public:
PrimesHelper(T max);
bool isPrime(T n);
private:
size_t max;
vector<T> _primes;
vector<char> _isPrime;
void calculatePrimes();
};
template <class T>
PrimesHelper<T>::PrimesHelper(T max)
{
this->max = (size_t)(sqrt(max));
_isPrime.resize(this->max + 1, true);
_isPrime[0] = _isPrime[1] = false;
calculatePrimes();
}
template <class T>
void PrimesHelper<T>::calculatePrimes()
{
for (int i = 2; i <= max; i++)
{
if (_isPrime[i])
{
_primes.push_back(i);
for (int j = 2 * i; j <= max; j += i)
{
_isPrime[j] = false;
}
}
}
}
template <class T>
bool PrimesHelper<T>::isPrime(T n)
{
if (n < 0)
{
return false;
}
if (n <= max)
{
return _isPrime[n];
}
for (size_t i = 0; i < _primes.size(); i++)
{
if (n % _primes[i] == 0)
{
return false;
}
}
return true;
}
template <class T>
bool isPrime(T n)
{
static PrimesHelper<T> primesHelper(GetMax<T>::Value);
return primesHelper.isPrime(n);
}
template <class T>
int addDigits(T n)
{
int ret = 0;
while (n > 0)
{
ret += n % 10;
n /= 10;
}
return ret;
}
void solve(int n, int expectedAnswer = -1)
{
int solution = isPrime(addDigits(n));
if (expectedAnswer != -1 && solution != expectedAnswer)
{
cout << "[!!!WRONG ANSWER!!!] ";
}
cout << (solution ? "yes\n" : "no\n");
}
int main()
{
solve(0, false);
solve(100, false);
solve(101, true);
solve(200, true);
solve(300, true);
solve(111, true);
solve(112, false);
solve(4, false);
solve(301, false);
solve(340, true);
solve(61, true);
solve(7, true);
solve(223, true);
solve(9992, true);
solve(9993, false);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBHZXRNYXggeyBwdWJsaWM6IHN0YXRpYyBUIGNvbnN0IFZhbHVlOyB9Owp0ZW1wbGF0ZSA8Y2xhc3MgVD4gVCBjb25zdCBHZXRNYXg8VD46OlZhbHVlID0gc3RyaW5nKCJOb3Qgc3VwcG9ydGVkISIpOwp0ZW1wbGF0ZSA8PiBpbnQgY29uc3QgR2V0TWF4PGludD46OlZhbHVlID0gMHg3RkZGRkZGRjsKdGVtcGxhdGUgPD4gdW5zaWduZWQgaW50IGNvbnN0IEdldE1heDx1bnNpZ25lZCBpbnQ+OjpWYWx1ZSA9IDB4RkZGRkZGRkZVOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFByaW1lc0hlbHBlcgp7CnB1YmxpYzoKICBQcmltZXNIZWxwZXIoVCBtYXgpOwogIGJvb2wgaXNQcmltZShUIG4pOwpwcml2YXRlOgogIHNpemVfdCBtYXg7CiAgdmVjdG9yPFQ+IF9wcmltZXM7CiAgdmVjdG9yPGNoYXI+IF9pc1ByaW1lOwogIHZvaWQgY2FsY3VsYXRlUHJpbWVzKCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KUHJpbWVzSGVscGVyPFQ+OjpQcmltZXNIZWxwZXIoVCBtYXgpCnsKICB0aGlzLT5tYXggPSAoc2l6ZV90KShzcXJ0KG1heCkpOwogIF9pc1ByaW1lLnJlc2l6ZSh0aGlzLT5tYXggKyAxLCB0cnVlKTsKICBfaXNQcmltZVswXSA9IF9pc1ByaW1lWzFdID0gZmFsc2U7CiAgY2FsY3VsYXRlUHJpbWVzKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIFByaW1lc0hlbHBlcjxUPjo6Y2FsY3VsYXRlUHJpbWVzKCkKewogIGZvciAoaW50IGkgPSAyOyBpIDw9IG1heDsgaSsrKQogIHsKICAgIGlmIChfaXNQcmltZVtpXSkKICAgIHsKICAgICAgX3ByaW1lcy5wdXNoX2JhY2soaSk7CiAgICAgIGZvciAoaW50IGogPSAyICogaTsgaiA8PSBtYXg7IGogKz0gaSkKICAgICAgewogICAgICAgIF9pc1ByaW1lW2pdID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpib29sIFByaW1lc0hlbHBlcjxUPjo6aXNQcmltZShUIG4pCnsKICBpZiAobiA8IDApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKG4gPD0gbWF4KQogIHsKICAgIHJldHVybiBfaXNQcmltZVtuXTsKICB9CgogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgX3ByaW1lcy5zaXplKCk7IGkrKykKICB7CiAgICBpZiAobiAlIF9wcmltZXNbaV0gPT0gMCkKICAgIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgpib29sIGlzUHJpbWUoVCBuKQp7CiAgc3RhdGljIFByaW1lc0hlbHBlcjxUPiBwcmltZXNIZWxwZXIoR2V0TWF4PFQ+OjpWYWx1ZSk7CiAgcmV0dXJuIHByaW1lc0hlbHBlci5pc1ByaW1lKG4pOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW50IGFkZERpZ2l0cyhUIG4pCnsKICBpbnQgcmV0ID0gMDsKICB3aGlsZSAobiA+IDApCiAgewogICAgcmV0ICs9IG4gJSAxMDsKICAgIG4gLz0gMTA7CiAgfQogIHJldHVybiByZXQ7Cn0KCnZvaWQgc29sdmUoaW50IG4sIGludCBleHBlY3RlZEFuc3dlciA9ICAtMSkKewogIGludCBzb2x1dGlvbiA9IGlzUHJpbWUoYWRkRGlnaXRzKG4pKTsKICBpZiAoZXhwZWN0ZWRBbnN3ZXIgIT0gLTEgJiYgc29sdXRpb24gIT0gZXhwZWN0ZWRBbnN3ZXIpCiAgewogICAgY291dCA8PCAiWyEhIVdST05HIEFOU1dFUiEhIV0gIjsKICB9CgogIGNvdXQgPDwgKHNvbHV0aW9uID8gInllc1xuIiA6ICJub1xuIik7Cn0KCmludCBtYWluKCkKewogIHNvbHZlKDAsIGZhbHNlKTsKICBzb2x2ZSgxMDAsIGZhbHNlKTsKICBzb2x2ZSgxMDEsIHRydWUpOwogIHNvbHZlKDIwMCwgdHJ1ZSk7CiAgc29sdmUoMzAwLCB0cnVlKTsKICBzb2x2ZSgxMTEsIHRydWUpOwogIHNvbHZlKDExMiwgZmFsc2UpOwogIHNvbHZlKDQsIGZhbHNlKTsKICBzb2x2ZSgzMDEsIGZhbHNlKTsKICBzb2x2ZSgzNDAsIHRydWUpOwogIHNvbHZlKDYxLCB0cnVlKTsKICBzb2x2ZSg3LCB0cnVlKTsKICBzb2x2ZSgyMjMsIHRydWUpOwogIHNvbHZlKDk5OTIsIHRydWUpOwogIHNvbHZlKDk5OTMsIGZhbHNlKTsKICByZXR1cm4gMDsKfQ==