#include <stdio.h>
#include <cstdint>
const int ERATO_SIZE = 500000 + 10;
unsigned char ERATO[ERATO_SIZE];
bool is_prime(uint64_t num) {
if (num == 1) return false;
if (num == 2) return true;
if ((num % 2) == 0) return false;
uint64_t i = 1;
uint64_t j = 2*i + 1;
while (j * j < num) {
if ((num % j) == 0) return false;
i++;
j = 2*i+1;
}
return true;
}
bool is_duoprime(uint64_t num) {
uint64_t pos = 10;
while (pos < num) {
uint64_t a = num / pos;
uint64_t b = num % pos;
if (pos / 10 <= b) {
if (is_prime(a) && is_prime(b)) {
return true;
}
}
pos *= 10;
}
return false;
}
int main() {
// Create Eratosthenes sieve.
for (int i = 0; i < ERATO_SIZE; ++i) ERATO[i] = 1;
for (int i = 1; i * i < ERATO_SIZE; ++i) {
int jump = i * 2 + 1;
if (ERATO[i] == 1) {
for (int j = i + jump; j < ERATO_SIZE; j += jump) ERATO[j] = 0;
}
}
uint64_t input;
scanf("%lld", &input);
printf("%s\n", is_duoprime(input) ? "TAK" : "NIE");
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 | #include <stdio.h> #include <cstdint> const int ERATO_SIZE = 500000 + 10; unsigned char ERATO[ERATO_SIZE]; bool is_prime(uint64_t num) { if (num == 1) return false; if (num == 2) return true; if ((num % 2) == 0) return false; uint64_t i = 1; uint64_t j = 2*i + 1; while (j * j < num) { if ((num % j) == 0) return false; i++; j = 2*i+1; } return true; } bool is_duoprime(uint64_t num) { uint64_t pos = 10; while (pos < num) { uint64_t a = num / pos; uint64_t b = num % pos; if (pos / 10 <= b) { if (is_prime(a) && is_prime(b)) { return true; } } pos *= 10; } return false; } int main() { // Create Eratosthenes sieve. for (int i = 0; i < ERATO_SIZE; ++i) ERATO[i] = 1; for (int i = 1; i * i < ERATO_SIZE; ++i) { int jump = i * 2 + 1; if (ERATO[i] == 1) { for (int j = i + jump; j < ERATO_SIZE; j += jump) ERATO[j] = 0; } } uint64_t input; scanf("%lld", &input); printf("%s\n", is_duoprime(input) ? "TAK" : "NIE"); return 0; } |
English