#[allow(unused_imports)]
use std::io::{BufWriter, stdin, stdout, Write};
#[derive(Default)]
struct Scanner { buf: Vec<String> }
impl Scanner {
fn next<T: std::str::FromStr>(&mut self) -> T {
loop {
if let Some(tok) = self.buf.pop() {
return tok.parse().ok().unwrap();
}
let mut s = String::new();
stdin().read_line(&mut s).unwrap();
self.buf = s.split_whitespace().rev().map(String::from).collect();
}
}
}
#[allow(unused_variables)]
macro_rules! io_init { ($scan:ident,$out:ident) => {
let mut $scan = Scanner::default();
let $out = &mut BufWriter::new(stdout());
}}
macro_rules! read { ($scan:ident, $($v:pat=>$t:ty),*) => { $(let $v = $scan.next::<$t>();)* }; }
fn solve(primes: &Vec<usize>, scan: &mut Scanner, out: &mut BufWriter<std::io::Stdout>) {
read!(scan, l0=>i64, r0=>i64);
let l = l0 * 2;
let r = r0 * 2;
let m = (r - l + 1) as usize;
let mut vis = vec![true; m];
for &p in primes {
let p = p as i64;
if p * p > r { break; }
let start = ((l + p - 1) / p).max(2) * p;
let mut j = start;
while j <= r {
vis[(j - l) as usize] = false;
j += p;
}
}
let mut pre = vec![-1isize; m];
for i in 1..m {
pre[i] = if vis[i] { i as isize } else { pre[i-1] };
}
let mut nex = vec![-1isize; m];
for i in (0..m-1).rev() {
nex[i] = if vis[i] { i as isize } else { nex[i+1] };
}
let mut mi = m as isize;
let mut cnt = 0i64;
fn dfs(l: isize, r: isize, pre: &Vec<isize>, nex: &Vec<isize>, mi: &mut isize, cnt: &mut i64) {
if r - l < *mi {
*mi = r - l;
*cnt = 1;
} else if r - l == *mi {
*cnt += 1;
}
let mid1 = (l + r) / 2;
let x = pre[mid1 as usize];
if x != -1 && x > l {
dfs(x, r, pre, nex, mi, cnt);
}
let mid2 = (l + r + 1) / 2;
let y = nex[mid2 as usize];
if y != -1 && y < r {
dfs(l, y, pre, nex, mi, cnt);
}
}
dfs(0, (m-1) as isize, &pre, &nex, &mut mi, &mut cnt);
writeln!(out, "{}", cnt).unwrap();
}
fn main() {
io_init!(scan,out);
let maxn = 2_000_000;
let mut is_comp = vec![false; maxn+1];
let mut primes = Vec::new();
for i in 2..=maxn {
if !is_comp[i] {
primes.push(i);
}
for &p in &primes {
let x = i * p;
if x > maxn { break; }
is_comp[x] = true;
if i % p == 0 { break; }
}
}
read!(scan, T=>usize);
for _ in 0..T {
solve(&primes, &mut scan, out);
}
}
I1thbGxvdyh1bnVzZWRfaW1wb3J0cyldCnVzZSBzdGQ6OmlvOjp7QnVmV3JpdGVyLCBzdGRpbiwgc3Rkb3V0LCBXcml0ZX07CgojW2Rlcml2ZShEZWZhdWx0KV0Kc3RydWN0IFNjYW5uZXIgeyBidWY6IFZlYzxTdHJpbmc+IH0KaW1wbCBTY2FubmVyIHsKICAgIGZuIG5leHQ8VDogc3RkOjpzdHI6OkZyb21TdHI+KCZtdXQgc2VsZikgLT4gVCB7CiAgICAgICAgbG9vcCB7CiAgICAgICAgICAgIGlmIGxldCBTb21lKHRvaykgPSBzZWxmLmJ1Zi5wb3AoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rLnBhcnNlKCkub2soKS51bndyYXAoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgbXV0IHMgPSBTdHJpbmc6Om5ldygpOwogICAgICAgICAgICBzdGRpbigpLnJlYWRfbGluZSgmbXV0IHMpLnVud3JhcCgpOwogICAgICAgICAgICBzZWxmLmJ1ZiA9IHMuc3BsaXRfd2hpdGVzcGFjZSgpLnJldigpLm1hcChTdHJpbmc6OmZyb20pLmNvbGxlY3QoKTsKICAgICAgICB9CiAgICB9Cn0KCiNbYWxsb3codW51c2VkX3ZhcmlhYmxlcyldCm1hY3JvX3J1bGVzISBpb19pbml0IHsgKCRzY2FuOmlkZW50LCRvdXQ6aWRlbnQpID0+IHsKICAgIGxldCBtdXQgJHNjYW4gPSBTY2FubmVyOjpkZWZhdWx0KCk7CiAgICBsZXQgJG91dCA9ICZtdXQgQnVmV3JpdGVyOjpuZXcoc3Rkb3V0KCkpOwp9fQoKbWFjcm9fcnVsZXMhIHJlYWQgeyAoJHNjYW46aWRlbnQsICQoJHY6cGF0PT4kdDp0eSksKikgPT4geyAkKGxldCAkdiA9ICRzY2FuLm5leHQ6OjwkdD4oKTspKiB9OyB9CgpmbiBzb2x2ZShwcmltZXM6ICZWZWM8dXNpemU+LCBzY2FuOiAmbXV0IFNjYW5uZXIsIG91dDogJm11dCBCdWZXcml0ZXI8c3RkOjppbzo6U3Rkb3V0PikgewogICAgcmVhZCEoc2NhbiwgbDA9Pmk2NCwgcjA9Pmk2NCk7CiAgICBsZXQgbCA9IGwwICogMjsKICAgIGxldCByID0gcjAgKiAyOwogICAgbGV0IG0gPSAociAtIGwgKyAxKSBhcyB1c2l6ZTsKICAgIGxldCBtdXQgdmlzID0gdmVjIVt0cnVlOyBtXTsKICAgIGZvciAmcCBpbiBwcmltZXMgewogICAgICAgIGxldCBwID0gcCBhcyBpNjQ7CiAgICAgICAgaWYgcCAqIHAgPiByIHsgYnJlYWs7IH0KICAgICAgICBsZXQgc3RhcnQgPSAoKGwgKyBwIC0gMSkgLyBwKS5tYXgoMikgKiBwOwogICAgICAgIGxldCBtdXQgaiA9IHN0YXJ0OwogICAgICAgIHdoaWxlIGogPD0gciB7CiAgICAgICAgICAgIHZpc1soaiAtIGwpIGFzIHVzaXplXSA9IGZhbHNlOwogICAgICAgICAgICBqICs9IHA7CiAgICAgICAgfQogICAgfQogICAgbGV0IG11dCBwcmUgPSB2ZWMhWy0xaXNpemU7IG1dOwogICAgZm9yIGkgaW4gMS4ubSB7CiAgICAgICAgcHJlW2ldID0gaWYgdmlzW2ldIHsgaSBhcyBpc2l6ZSB9IGVsc2UgeyBwcmVbaS0xXSB9OwogICAgfQogICAgbGV0IG11dCBuZXggPSB2ZWMhWy0xaXNpemU7IG1dOwogICAgZm9yIGkgaW4gKDAuLm0tMSkucmV2KCkgewogICAgICAgIG5leFtpXSA9IGlmIHZpc1tpXSB7IGkgYXMgaXNpemUgfSBlbHNlIHsgbmV4W2krMV0gfTsKICAgIH0KICAgIGxldCBtdXQgbWkgPSBtIGFzIGlzaXplOwogICAgbGV0IG11dCBjbnQgPSAwaTY0OwogICAgZm4gZGZzKGw6IGlzaXplLCByOiBpc2l6ZSwgcHJlOiAmVmVjPGlzaXplPiwgbmV4OiAmVmVjPGlzaXplPiwgbWk6ICZtdXQgaXNpemUsIGNudDogJm11dCBpNjQpIHsKICAgICAgICBpZiByIC0gbCA8ICptaSB7CiAgICAgICAgICAgICptaSA9IHIgLSBsOwogICAgICAgICAgICAqY250ID0gMTsKICAgICAgICB9IGVsc2UgaWYgciAtIGwgPT0gKm1pIHsKICAgICAgICAgICAgKmNudCArPSAxOwogICAgICAgIH0KICAgICAgICBsZXQgbWlkMSA9IChsICsgcikgLyAyOwogICAgICAgIGxldCB4ID0gcHJlW21pZDEgYXMgdXNpemVdOwogICAgICAgIGlmIHggIT0gLTEgJiYgeCA+IGwgewogICAgICAgICAgICBkZnMoeCwgciwgcHJlLCBuZXgsIG1pLCBjbnQpOwogICAgICAgIH0KICAgICAgICBsZXQgbWlkMiA9IChsICsgciArIDEpIC8gMjsKICAgICAgICBsZXQgeSA9IG5leFttaWQyIGFzIHVzaXplXTsKICAgICAgICBpZiB5ICE9IC0xICYmIHkgPCByIHsKICAgICAgICAgICAgZGZzKGwsIHksIHByZSwgbmV4LCBtaSwgY250KTsKICAgICAgICB9CiAgICB9CiAgICBkZnMoMCwgKG0tMSkgYXMgaXNpemUsICZwcmUsICZuZXgsICZtdXQgbWksICZtdXQgY250KTsKICAgIHdyaXRlbG4hKG91dCwgInt9IiwgY250KS51bndyYXAoKTsKfQoKZm4gbWFpbigpIHsKICAgIGlvX2luaXQhKHNjYW4sb3V0KTsKICAgIGxldCBtYXhuID0gMl8wMDBfMDAwOwogICAgbGV0IG11dCBpc19jb21wID0gdmVjIVtmYWxzZTsgbWF4bisxXTsKICAgIGxldCBtdXQgcHJpbWVzID0gVmVjOjpuZXcoKTsKICAgIGZvciBpIGluIDIuLj1tYXhuIHsKICAgICAgICBpZiAhaXNfY29tcFtpXSB7CiAgICAgICAgICAgIHByaW1lcy5wdXNoKGkpOwogICAgICAgIH0KICAgICAgICBmb3IgJnAgaW4gJnByaW1lcyB7CiAgICAgICAgICAgIGxldCB4ID0gaSAqIHA7CiAgICAgICAgICAgIGlmIHggPiBtYXhuIHsgYnJlYWs7IH0KICAgICAgICAgICAgaXNfY29tcFt4XSA9IHRydWU7CiAgICAgICAgICAgIGlmIGkgJSBwID09IDAgeyBicmVhazsgfQogICAgICAgIH0KICAgIH0KICAgIHJlYWQhKHNjYW4sIFQ9PnVzaXplKTsKICAgIGZvciBfIGluIDAuLlQgewogICAgICAgIHNvbHZlKCZwcmltZXMsICZtdXQgc2Nhbiwgb3V0KTsKICAgIH0KfQo=