Problem:
Score : 400 points

Problem Statement

We say that a odd number N is similar to 2017 when both N and (N+1)/2 are prime.

You are given Q queries.

In the i-th query, given two odd numbers l_i and r_i, find the number of odd numbers x similar to 2017 such that l_i ≤ x ≤ r_i.

Constraints

1≤Q≤10^5

1≤l_i≤r_i≤10^5

l_i and r_i are odd.

All input values are integers.

Input

Input is given from Standard Input in the following format:

Q
l_1 r_1
:
l_Q r_Q

Output

Print Q lines. The i-th line (1≤i≤Q) should contain the response to the i-th query.

Sample Input 1

1
3 7

Sample Output 1

2

3 is similar to 2017, since both 3 and (3+1)/2=2 are prime.

5 is similar to 2017, since both 5 and (5+1)/2=3 are prime.

7 is not similar to 2017, since (7+1)/2=4 is not prime, although 7 is prime.

Thus, the response to the first query should be 2.

Sample Input 2

4
13 13
7 11
7 11
2017 2017

Sample Output 2

1
0
0
1

Note that 2017 is also similar to 2017.

Sample Input 3

6
1 53
13 91
37 55
19 51
73 91
13 49

Sample Output 3

4
4
1
1
1
2

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using E = System.Linq.Enumerable;

class Program
{
    static void Main(string[] args)
    {
        //入力を受け取る
        var Q = long.Parse(Console.ReadLine());
        var koho = SieveOfEratosthenes(100000);
          
     
        var B = new int[100001];
        foreach(int item in koho){
          if(koho.Contains((item+1)/2)){
            B[item] = 1;
          }
        }
      
        for(int i = 1; i < B.Length ;i++){
          B[i] += B[i-1];
        }
      
        //各クエリの答えを出力する
        for(int i = 0; i < Q ;i++){
          var LR = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray();
          var L = LR[0];
          var R = LR[1];
          Console.WriteLine(B[R]-B[L-1]);
        }
       
        
        
    }
  
  public static List<int> SieveOfEratosthenes(int n)
{
    // 素数を格納するリスト
    var primes = new List<int>();
    // 素数候補のリスト[2..n]
    var list = Enumerable.Range(2, n - 2).ToList();

    // 2以下の数の場合は空、2の場合は2を返す。
    if (n < 2) return primes;
    else if (n == 2) return new List<int>(2);

    // 素数候補をふるい落としながら素数を探す
    while (Math.Pow(list[0], 2) <= n)
    {
        var first = list[0];    // 先頭要素
        primes.Add(first);      // 先頭を素数リストへ
        list.RemoveAt(0);       // 先頭要素削除

        // 素数の倍数をふるい落とし
        list.RemoveAll(x => x % first == 0);
    }
    // 残りの探索リストをまとめて素数リストに追加
    primes.AddRange(list.ToArray());
    return primes;
}
}