#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
namespace {
template<typename T>
constexpr T square(T x)
{
return x*x;
}
template <typename T>
constexpr T ipow(T base, int power)
{
return power == 0 ? 1 : (square(ipow(base, power / 2)) * (power % 2 == 0 ? 1 : base));
}
template <typename T>
constexpr T isqrt_next(T n, T x)
{
return (x + n / x) / 2;
}
template <typename T>
constexpr T isqrt_helper(T n, T x1, T x2)
{
return (x2 == x1 || x2 == x1 + 1) ? x1 : isqrt_helper(n, x2, isqrt_next(n, x2));
}
template <typename T>
constexpr T isqrt(T n)
{
return isqrt_helper(n, n, isqrt_next(n, n));
}
constexpr auto max_n = ipow(10LL, 13);
constexpr auto max_p = isqrt(max_n);
template <int N>
struct Sieve {
bool is_prime[N];
vector<int> primes;
Sieve()
{
is_prime[0] = is_prime[1] = false;
for (int i = 2; i < N; ++i) {
is_prime[i] = true;
}
for (int p = 2; p <= N / p; ++p) {
if (!is_prime[p]) continue;
for (int q = p * p; q < N; q += p) {
is_prime[q] = false;
}
}
for (int i = 2; i < N; ++i) {
if (is_prime[i]) primes.emplace_back(i);
}
}
};
bool is_prime(long long n)
{
static Sieve<max_p> sieve;
if (n < max_p) return sieve.is_prime[n];
for (int p: sieve.primes) {
if (p > n / p) break;
if (n % p == 0) return false;
}
return true;
}
bool is_prime(long long a, long long b)
{
if (a > b) swap(a, b);
return is_prime(a) && is_prime(b);
}
bool solve(long long n)
{
long long l = n;
long long r = 0;
long long p = 1;
while (l > 0) {
int d = l % 10;
l /= 10;
r += d * p;
p *= 10;
if (d != 0 && is_prime(l, r)) {
return true;
}
}
return false;
}
}
int main()
{
iostream::sync_with_stdio(false);
cin.tie(nullptr);
long long n;
cin >> n;
cout << (solve(n) ? "TAK" : "NIE") << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <algorithm> #include <iostream> #include <vector> using namespace std; namespace { template<typename T> constexpr T square(T x) { return x*x; } template <typename T> constexpr T ipow(T base, int power) { return power == 0 ? 1 : (square(ipow(base, power / 2)) * (power % 2 == 0 ? 1 : base)); } template <typename T> constexpr T isqrt_next(T n, T x) { return (x + n / x) / 2; } template <typename T> constexpr T isqrt_helper(T n, T x1, T x2) { return (x2 == x1 || x2 == x1 + 1) ? x1 : isqrt_helper(n, x2, isqrt_next(n, x2)); } template <typename T> constexpr T isqrt(T n) { return isqrt_helper(n, n, isqrt_next(n, n)); } constexpr auto max_n = ipow(10LL, 13); constexpr auto max_p = isqrt(max_n); template <int N> struct Sieve { bool is_prime[N]; vector<int> primes; Sieve() { is_prime[0] = is_prime[1] = false; for (int i = 2; i < N; ++i) { is_prime[i] = true; } for (int p = 2; p <= N / p; ++p) { if (!is_prime[p]) continue; for (int q = p * p; q < N; q += p) { is_prime[q] = false; } } for (int i = 2; i < N; ++i) { if (is_prime[i]) primes.emplace_back(i); } } }; bool is_prime(long long n) { static Sieve<max_p> sieve; if (n < max_p) return sieve.is_prime[n]; for (int p: sieve.primes) { if (p > n / p) break; if (n % p == 0) return false; } return true; } bool is_prime(long long a, long long b) { if (a > b) swap(a, b); return is_prime(a) && is_prime(b); } bool solve(long long n) { long long l = n; long long r = 0; long long p = 1; while (l > 0) { int d = l % 10; l /= 10; r += d * p; p *= 10; if (d != 0 && is_prime(l, r)) { return true; } } return false; } } int main() { iostream::sync_with_stdio(false); cin.tie(nullptr); long long n; cin >> n; cout << (solve(n) ? "TAK" : "NIE") << endl; return 0; } |
English