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

object Main extends App {

  import scala.io.StdIn._
  import scala.math._

  val n = readLine.trim.toInt
  val prime = primes(n + 2)
  var count = 0
  for (i ← 1 until prime.size){
    if (prime(i) == prime(i - 1) + 2) {
      count += 2
    }
  }
  println(count)
  def primes(upper:Int): Array[Int] = {
    val memo = Array.tabulate(upper + 1){_ ⇒ true}
    for (i ← 2 to math.sqrt(upper).toInt){
      if (memo(i)){
        for (j ← i * 2 to upper by i){
          memo(j) = false
        }
      }
    }
    (2 to upper).filter(it ⇒ memo(it)).toArray
  }
  implicit class Extension[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}