fork download
  1. #[allow(unused_imports)]
  2. use std::io::{BufWriter, stdin, stdout, Write};
  3.  
  4. #[derive(Default)]
  5. struct Scanner { buf: Vec<String> }
  6. impl Scanner {
  7. fn next<T: std::str::FromStr>(&mut self) -> T {
  8. loop {
  9. if let Some(tok) = self.buf.pop() {
  10. return tok.parse().ok().unwrap();
  11. }
  12. let mut s = String::new();
  13. stdin().read_line(&mut s).unwrap();
  14. self.buf = s.split_whitespace().rev().map(String::from).collect();
  15. }
  16. }
  17. }
  18.  
  19. #[allow(unused_variables)]
  20. macro_rules! io_init { ($scan:ident,$out:ident) => {
  21. let mut $scan = Scanner::default();
  22. let $out = &mut BufWriter::new(stdout());
  23. }}
  24.  
  25. macro_rules! read { ($scan:ident, $($v:pat=>$t:ty),*) => { $(let $v = $scan.next::<$t>();)* }; }
  26.  
  27. fn solve(primes: &Vec<usize>, scan: &mut Scanner, out: &mut BufWriter<std::io::Stdout>) {
  28. read!(scan, l0=>i64, r0=>i64);
  29. let l = l0 * 2;
  30. let r = r0 * 2;
  31. let m = (r - l + 1) as usize;
  32. let mut vis = vec![true; m];
  33. for &p in primes {
  34. let p = p as i64;
  35. if p * p > r { break; }
  36. let start = ((l + p - 1) / p).max(2) * p;
  37. let mut j = start;
  38. while j <= r {
  39. vis[(j - l) as usize] = false;
  40. j += p;
  41. }
  42. }
  43. let mut pre = vec![-1isize; m];
  44. for i in 1..m {
  45. pre[i] = if vis[i] { i as isize } else { pre[i-1] };
  46. }
  47. let mut nex = vec![-1isize; m];
  48. for i in (0..m-1).rev() {
  49. nex[i] = if vis[i] { i as isize } else { nex[i+1] };
  50. }
  51. let mut mi = m as isize;
  52. let mut cnt = 0i64;
  53. fn dfs(l: isize, r: isize, pre: &Vec<isize>, nex: &Vec<isize>, mi: &mut isize, cnt: &mut i64) {
  54. if r - l < *mi {
  55. *mi = r - l;
  56. *cnt = 1;
  57. } else if r - l == *mi {
  58. *cnt += 1;
  59. }
  60. let mid1 = (l + r) / 2;
  61. let x = pre[mid1 as usize];
  62. if x != -1 && x > l {
  63. dfs(x, r, pre, nex, mi, cnt);
  64. }
  65. let mid2 = (l + r + 1) / 2;
  66. let y = nex[mid2 as usize];
  67. if y != -1 && y < r {
  68. dfs(l, y, pre, nex, mi, cnt);
  69. }
  70. }
  71. dfs(0, (m-1) as isize, &pre, &nex, &mut mi, &mut cnt);
  72. writeln!(out, "{}", cnt).unwrap();
  73. }
  74.  
  75. fn main() {
  76. io_init!(scan,out);
  77. let maxn = 2_000_000;
  78. let mut is_comp = vec![false; maxn+1];
  79. let mut primes = Vec::new();
  80. for i in 2..=maxn {
  81. if !is_comp[i] {
  82. primes.push(i);
  83. }
  84. for &p in &primes {
  85. let x = i * p;
  86. if x > maxn { break; }
  87. is_comp[x] = true;
  88. if i % p == 0 { break; }
  89. }
  90. }
  91. read!(scan, T=>usize);
  92. for _ in 0..T {
  93. solve(&primes, &mut scan, out);
  94. }
  95. }
  96.  
Success #stdin #stdout 0.03s 8608KB
stdin
3
1 30
16 18
142857 240135
stdout
3
1
63