#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
vector<int> digit;
vector<int> getDigit(ll N) {
vector<int> ans;
for (; N > 0; N /= 10) ans.push_back(N % 10);
return ans;
}
bool isPrime[136];
void sieve() {
for (int i = 2; i <= 135; i++) isPrime[i] = true;
for (int i = 2; i * i <= 135; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= 135; j += i) isPrime[j] = false;
}
}
}
ll memo[16][2][3][136][136];
// Số cặp số của phần còn lại thoả mãn điều kiện và có "số nhớ" ở vị trí idx hiện tại là carry
// khi phần prefix ở trước vị trí idx mang theo điều kiện smaller
// và có tổng các chữ số của x là sum_digit_x, tổng các chữ số của y là sum_digit_y
ll dp(int idx, bool smaller, int carry, int sum_digit_x, int sum_digit_y) {
if (idx == -1) {
return (carry == 0 && isPrime[sum_digit_x] && isPrime[sum_digit_y]);
}
ll& ans = memo[idx][smaller][carry][sum_digit_x][sum_digit_y];
if (ans != -1) return ans;
ans = 0;
int max_digit = (smaller) ? 9 : digit[idx];
for (int prev_carry = 0; prev_carry <= 2; prev_carry++) {
for (int x_i = 0; x_i <= 9; x_i++) {
for (int y_i = 0; y_i <= 9; y_i++) {
int sum = x_i + 2 * y_i + prev_carry;
int i = sum % 10;
if (i > max_digit) continue;
if (sum / 10 != carry) continue;
ans += dp(idx - 1, smaller | (i < digit[idx]), prev_carry, sum_digit_x + x_i, sum_digit_y + y_i);
}
}
}
return ans;
}
ll solve(ll N) {
digit = getDigit(N);
memset(memo, -1, sizeof memo);
return dp(digit.size() - 1, 0, 0, 0, 0);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
sieve();
ll N;
cin >> N;
ll ans = solve(N) - solve(N - 1);
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdmVjdG9yPGludD4gZGlnaXQ7IAoKdmVjdG9yPGludD4gZ2V0RGlnaXQobGwgTikgewoJdmVjdG9yPGludD4gYW5zOyAKCWZvciAoOyBOID4gMDsgTiAvPSAxMCkgYW5zLnB1c2hfYmFjayhOICUgMTApOyAKCXJldHVybiBhbnM7IAp9Cgpib29sIGlzUHJpbWVbMTM2XTsKCnZvaWQgc2lldmUoKSB7Cglmb3IgKGludCBpID0gMjsgaSA8PSAxMzU7IGkrKykgaXNQcmltZVtpXSA9IHRydWU7ICAKCWZvciAoaW50IGkgPSAyOyBpICogaSA8PSAxMzU7IGkrKykgewoJCWlmIChpc1ByaW1lW2ldKSB7CgkJCWZvciAoaW50IGogPSBpICogaTsgaiA8PSAxMzU7IGogKz0gaSkgaXNQcmltZVtqXSA9IGZhbHNlOyAKCQl9Cgl9Cn0KCmxsIG1lbW9bMTZdWzJdWzNdWzEzNl1bMTM2XTsKCi8vIFPhu5EgY+G6t3Agc+G7kSBj4bunYSBwaOG6p24gY8OybiBs4bqhaSB0aG/huqMgbcOjbiDEkWnhu4F1IGtp4buHbiB2w6AgY8OzICJz4buRIG5o4bubIiDhu58gduG7iyB0csOtIGlkeCBoaeG7h24gdOG6oWkgbMOgIGNhcnJ5IAovLyBraGkgcGjhuqduIHByZWZpeCDhu58gdHLGsOG7m2MgduG7iyB0csOtIGlkeCBtYW5nIHRoZW8gxJFp4buBdSBraeG7h24gc21hbGxlciAKLy8gdsOgIGPDsyB04buVbmcgY8OhYyBjaOG7ryBz4buRIGPhu6dhIHggbMOgIHN1bV9kaWdpdF94LCB04buVbmcgY8OhYyBjaOG7ryBz4buRIGPhu6dhIHkgbMOgIHN1bV9kaWdpdF95IApsbCBkcChpbnQgaWR4LCBib29sIHNtYWxsZXIsIGludCBjYXJyeSwgaW50IHN1bV9kaWdpdF94LCBpbnQgc3VtX2RpZ2l0X3kpIHsKCWlmIChpZHggPT0gLTEpIHsKCQlyZXR1cm4gKGNhcnJ5ID09IDAgJiYgaXNQcmltZVtzdW1fZGlnaXRfeF0gJiYgaXNQcmltZVtzdW1fZGlnaXRfeV0pOyAKCX0KCglsbCYgYW5zID0gbWVtb1tpZHhdW3NtYWxsZXJdW2NhcnJ5XVtzdW1fZGlnaXRfeF1bc3VtX2RpZ2l0X3ldOyAKCWlmIChhbnMgIT0gLTEpIHJldHVybiBhbnM7ICAKCglhbnMgPSAwOyAgCglpbnQgbWF4X2RpZ2l0ID0gKHNtYWxsZXIpID8gOSA6IGRpZ2l0W2lkeF07IAoJZm9yIChpbnQgcHJldl9jYXJyeSA9IDA7IHByZXZfY2FycnkgPD0gMjsgcHJldl9jYXJyeSsrKSB7CgkJZm9yIChpbnQgeF9pID0gMDsgeF9pIDw9IDk7IHhfaSsrKSB7CgkJCWZvciAoaW50IHlfaSA9IDA7IHlfaSA8PSA5OyB5X2krKykgewoJCQkJaW50IHN1bSA9IHhfaSArIDIgKiB5X2kgKyBwcmV2X2NhcnJ5OyAKCQkJCWludCBpID0gc3VtICUgMTA7IAoJCQkJaWYgKGkgPiBtYXhfZGlnaXQpIGNvbnRpbnVlOyAKCQkJCWlmIChzdW0gLyAxMCAhPSBjYXJyeSkgY29udGludWU7IAoJCQkJYW5zICs9IGRwKGlkeCAtIDEsIHNtYWxsZXIgfCAoaSA8IGRpZ2l0W2lkeF0pLCBwcmV2X2NhcnJ5LCBzdW1fZGlnaXRfeCArIHhfaSwgc3VtX2RpZ2l0X3kgKyB5X2kpOyAKCQkJfQoJCX0KCX0KCglyZXR1cm4gYW5zOyAKfQoKbGwgc29sdmUobGwgTikgewoJZGlnaXQgPSBnZXREaWdpdChOKTsgCgltZW1zZXQobWVtbywgLTEsIHNpemVvZiBtZW1vKTsgCglyZXR1cm4gZHAoZGlnaXQuc2l6ZSgpIC0gMSwgMCwgMCwgMCwgMCk7IAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCglzaWV2ZSgpOyAgIAoKCWxsIE47IAoJY2luID4+IE47IAoJbGwgYW5zID0gc29sdmUoTikgLSBzb2x2ZShOIC0gMSk7Cgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==