#include using namespace std; using ll = long long; using P = pair; using T = tuple; #define al(a) a.begin(), a.end() #define ral(a) a.rbegin(), a.rend() #define sz(a) (int)a.size() #define rep(i, n) for (int i = 0; i < (n); ++i) #define rrep(i, n) for (int i = 1; i <= (n); ++i) #define drep(i, n) for (int i = (n)-1; i >= 0; --i) #define db(a, b) cout << #a << ": " << a << " " << #b << ": " << b << endl; const int MX = 330005; vector primes; vector is_prime(MX, true); void sieve() { is_prime[0] = is_prime[1] = false; for (int i = 2; i <= MX; ++i) { if (is_prime[i]) { primes.push_back(i); for (int j = 2 * i; j <= MX; j += i) { is_prime[j] = false; } } } } vector cnt(MX); int main() { int n; cin >> n; sieve(); ll ans = 0; // for (int c = 2; primes[c] <= n; ++c) { // int b = c - 1; // rep(a, b) cnt[primes[a] + primes[b]]++; // for (int y = c + 1; primes[y] <= primes[c] * 3; ++y) { // ans += cnt[primes[y] - primes[c]]; // } // } rrep(i, sz(primes)) { int c = primes[i]; if (c > n) break; int b = primes[i - 1]; rep(j, i - 1) { int a = primes[j]; cnt[a + b]++; } rep(j, sz(primes)) { int sum = primes[j]; if (sum - c >= 0) ans += cnt[sum - c]; } } cout << ans << endl; return 0; } // int main() { // int n; // cin >> n; // set s; // const int MAX_N = 300005; // bool is_prime[MAX_N]; // for (int i = 0; i <= n; ++i) { is_prime[i] = true; } // is_prime[0] = is_prime[1] = false; // for (int i = 2; i <= n; ++i) { // if (is_prime[i]) { // s.insert(i); // for (int j = 2 * i; j <= n; j += i) { is_prime[j] = false; } // } // } // map mp; // mp[0] = 1; // rep(ri, 3) { // map pre; // swap(pre, mp); // for (auto [x, val] : pre) { // for (auto p : s) { // if (n < p) break; // mp[x + p] += val; // } // } // } // ll ans = 0; // for (auto [x, val] : mp) { // if (s.count(x)) ans += val; // } // cout << ans << endl; // // map mp; // // mp[P(1,0)] = 1; // // for (auto [x,val] : mp) { // // auto &[] // // for (auto p : s) { // // } // // } // return 0; // }