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 (judge verdict: Accepted)

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<inttypes.h>

typedef int32_t i32;

#define ALLOC(size,type) ((type*)calloc((size),sizeof(type)))

void run (void) {
  i32 n;
  scanf ("%" SCNi32, &n);
  n += 2;
  uint8_t *p = ALLOC (n + 1, uint8_t);
  for (i32 i = 2; i <= n; ++i) {
    p[i] = 1;
  }
  for (i32 i = 2; i * i <= n; ++i) {
    if (!p[i]) continue;
    for (i32 j = i * i; j <= n; j += i) {
      p[j] = 0;
    }
  }
  i32 ans = 0;
  for (i32 i = 5; i <= n; i += 2) {
    ans += p[i] & p[i - 2];
  }
  ans *= 2;
  printf ("%" PRIi32 "\n", ans);
}

int main (void) {
  run();
  return 0;
}