#include <iostream>
#include <string>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
vector<bool>primes;
void RotateArr(int arr[], int l, int r) {
while(l<=r) {
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
l++;
r--;
}
}
int FindNumber(int arr[], int n) {
int res = 0;
for(int i=0; i<n; i++) {
res *= 10;
res += arr[i];
}
return res;
}
bool check(int arr[], int dig) {
int dup[dig];
for(int i=0; i<dig; i++) {
for(int j=0; j<dig; j++)
dup[j] = arr[j];
/**
Rotation of array ;;;
Rotate the whole array
Rotate First n-i digit
Rotate Last i digit;
**/
RotateArr(dup, 0, dig-1);
RotateArr(dup, 0, dig-1-i);
RotateArr(dup, dig-i, dig-1);
int num = FindNumber(dup, dig);
if(!primes[num]) {
return false;
}
}
return true;
}
int main() {
int cnt = 0;
primes.push_back(false);
primes.push_back(false);
for(int i=2; i<1000000; i++) {
primes[i] = true;
}
for(int i=2; i<1000000; i++) {
if(primes[i] == true) {
for(int j=2; j*i < 1000000; j++) {
primes[j*i] = false;
}
}
}
for(int i=2; i<1000000; i++) {
if(primes[i]) {
int arr[100];
int num = i;
int dig = 0;
while(num) {
arr[dig++] = num%10;
num /= 10;
}
int l = 0, r = dig-1;
while(l<=r) {
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
l++;
r--;
}
if(check(arr, dig))
cnt++;
}
}
cout << cnt << endl;
primes.clear();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2ZWN0b3I8Ym9vbD5wcmltZXM7Cgp2b2lkIFJvdGF0ZUFycihpbnQgYXJyW10sIGludCBsLCBpbnQgcikgewogICAgd2hpbGUobDw9cikgewogICAgICAgICAgICBpbnQgdGVtcCA9IGFycltsXTsKICAgICAgICAgICAgYXJyW2xdID0gYXJyW3JdOwogICAgICAgICAgICBhcnJbcl0gPSB0ZW1wOwogICAgICAgICAgICBsKys7CiAgICAgICAgICAgIHItLTsKICAgIH0KfQppbnQgRmluZE51bWJlcihpbnQgYXJyW10sIGludCBuKSB7CiAgICBpbnQgcmVzID0gMDsKICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykgewogICAgICAgIHJlcyAqPSAxMDsKICAgICAgICByZXMgKz0gYXJyW2ldOwogICAgfQogICAgcmV0dXJuIHJlczsKfQpib29sIGNoZWNrKGludCBhcnJbXSwgaW50IGRpZykgewogICAgICAgaW50IGR1cFtkaWddOwogICAgICAgZm9yKGludCBpPTA7IGk8ZGlnOyBpKyspIHsKICAgICAgICAgICAgZm9yKGludCBqPTA7IGo8ZGlnOyBqKyspCiAgICAgICAgICAgICAgICBkdXBbal0gPSBhcnJbal07CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICBSb3RhdGlvbiBvZiBhcnJheSA7OzsKICAgICAgICAgICAgUm90YXRlIHRoZSB3aG9sZSBhcnJheQogICAgICAgICAgICBSb3RhdGUgRmlyc3Qgbi1pIGRpZ2l0CiAgICAgICAgICAgIFJvdGF0ZSBMYXN0IGkgZGlnaXQ7CiAgICAgICAgICAgICoqLwogICAgICAgICAgICBSb3RhdGVBcnIoZHVwLCAwLCBkaWctMSk7CiAgICAgICAgICAgIFJvdGF0ZUFycihkdXAsIDAsIGRpZy0xLWkpOwogICAgICAgICAgICBSb3RhdGVBcnIoZHVwLCBkaWctaSwgZGlnLTEpOwogICAgICAgICAgICBpbnQgbnVtID0gRmluZE51bWJlcihkdXAsIGRpZyk7CiAgICAgICAgICAgIGlmKCFwcmltZXNbbnVtXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICB9CiAgICAgICByZXR1cm4gdHJ1ZTsKfQppbnQgbWFpbigpIHsKICAgIGludCBjbnQgPSAwOwogICAgcHJpbWVzLnB1c2hfYmFjayhmYWxzZSk7CiAgICBwcmltZXMucHVzaF9iYWNrKGZhbHNlKTsKICAgIGZvcihpbnQgaT0yOyBpPDEwMDAwMDA7IGkrKykgewogICAgICAgIHByaW1lc1tpXSA9IHRydWU7CiAgICB9CiAgICBmb3IoaW50IGk9MjsgaTwxMDAwMDAwOyBpKyspIHsKICAgICAgICBpZihwcmltZXNbaV0gPT0gdHJ1ZSkgewogICAgICAgICAgICBmb3IoaW50IGo9MjsgaippIDwgMTAwMDAwMDsgaisrKSB7CiAgICAgICAgICAgICAgICBwcmltZXNbaippXSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yKGludCBpPTI7IGk8MTAwMDAwMDsgaSsrKSB7CiAgICAgICAgaWYocHJpbWVzW2ldKSB7CiAgICAgICAgICAgIGludCBhcnJbMTAwXTsKICAgICAgICAgICAgaW50IG51bSA9IGk7CiAgICAgICAgICAgIGludCBkaWcgPSAwOwogICAgICAgICAgICB3aGlsZShudW0pIHsKICAgICAgICAgICAgICAgIGFycltkaWcrK10gPSBudW0lMTA7CiAgICAgICAgICAgICAgICBudW0gLz0gMTA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGwgPSAwLCByID0gZGlnLTE7CiAgICAgICAgICAgIHdoaWxlKGw8PXIpIHsKICAgICAgICAgICAgICAgIGludCB0ZW1wID0gYXJyW2xdOwogICAgICAgICAgICAgICAgYXJyW2xdID0gYXJyW3JdOwogICAgICAgICAgICAgICAgYXJyW3JdID0gdGVtcDsKICAgICAgICAgICAgICAgIGwrKzsKICAgICAgICAgICAgICAgIHItLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihjaGVjayhhcnIsIGRpZykpCiAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8IGNudCA8PCBlbmRsOwogICAgcHJpbWVzLmNsZWFyKCk7CiAgICByZXR1cm4gMDsKfQo=