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


open Scanf
open Printf

let flip f x y = f y x

let rec range a b = if a >= b then [] else a :: range (a+1) b

let read_int () = scanf " %d" (fun x -> x)
let rec read_ints n = if n = 0 then [] else let i = read_int () in i :: read_ints (n-1)

let rec for_iter a b f = if a >= b then [] else let x = f a in x :: for_iter (a+1) b f
let rec for_iter_ a b f = if a >= b then () else (f a; for_iter_ (a+1) b f)
let rec for_iterr_ a b f = if a <= b then () else (f a; for_iterr_ (a-1) b f)

let gen_table ubound =
  let res = Array.make ubound 1 in
  res.(0) <- 0; res.(1) <- 0;
  for_iter_ 2 ubound (fun i ->
    if res.(i) > 0 then for_iter_ 2 (ubound / i) @@ fun j -> res.(i*j) <- 0);
  for_iterr_ ((ubound+1)/2) 1 (fun a ->
    let i = 2*a-1 in
    res.(i) <- if res.(i) = 1 && res.((i+1)/2) = 1 then 1 else 0);
  res.(2) <- 0;
  for_iter_ 1 ubound (fun i -> res.(i) <- res.(i) + res.(i-1));
  res

let () =
  let q = read_int () in
  let rs = for_iter 0 q (fun _ -> let l = read_int () in let r = read_int () in (l, r)) in
  let table = gen_table 200010 in
  flip List.iter rs (fun (l, r) -> printf "%d\n" (table.(r) - table.(l-1)))