Problem:
C: 素数

問題

ある日、素数が大好きなそすうさ君は $p + q$ が素数となるペア $(p, q)$ で遊んでいた。
そすうさ君は突然、このペアのうち、 $p$ と $q$ がともに $N$ 以下の素数であるペアがいくつあるか気になりだした。
そすうさ君に代わって個数を求めよ。

制約

入力値は全て整数である。

$1 \leq N \leq 10^7$

入力形式

入力は以下の形式で与えられる。

$N$

出力

ペアの個数を出力せよ。また、末尾に改行も出力せよ。

サンプル

サンプル入力 1

3

サンプル出力 1

2

ペアは $(2, 3), (3, 2)$ の二つである。

サンプル入力 2

20

サンプル出力 2

8

Solution in C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define REPF(i, a, n) for (int i = (a); i < (int)(n); i++)
#define REP(i, n) REPF(i, 0, n)
#define ALL(x) begin(x),end(x)
#define SZ(x) (int)(x.size())

vector<bool> isp;
void init_prime(int N) {
    isp = vector<bool>(N, true);
    isp[0] = isp[1] = false;
    REPF(i, 2, N) {
        if (i * i > N) break;
        if (!isp[i]) continue;
        REPF(j, 2, N) {
            if (i * j >= N) break;
            isp[i * j] = false;
        }
    }
}
signed main() {
    init_prime(10000007);
    int N;
    cin >> N;

    int ans = 0;
    REPF(i, 3, N + 1) {
        if (!isp[i]) continue;
        if (isp[i + 2]) {
            ans += 2;
        }
    }
    cout << ans << endl;
    return 0;
}