/* -*- coding: utf-8 -*- * * 3101.cc: No.3101 Range Eratosthenes Query - yukicoder */ #include #include using namespace std; /* constant */ const int N = 1000000; const int D = 1000; const int M = N / D; /* typedef */ /* global variables */ bool primes[N + 1]; int xds[N + 1], gds[M][D]; /* subroutines */ /* main */ int main() { fill(primes, primes + N + 1, true); primes[0] = primes[1] = false; fill(xds, xds + N + 1, 1); xds[0] = xds[1] = 0; for (int p = 2; p * p <= N; p++) if (primes[p]) { for (int q = p * 2; q <= N; q += p) { primes[q] = false; xds[q] = max(xds[q], q / p); } } for (int q = 1; q < M; q++) { for (int d = 0; d < D; d++) gds[q][d] = xds[q * D + d]; sort(gds[q], gds[q] + D); } int tn; scanf("%d", &tn); while (tn--) { int l, r; scanf("%d%d", &l, &r), r++; if (l == 1) { puts("1"); continue; } int lq = l / D, ld = l % D, rq = r / D, rd = r % D; int sum = 0; if (lq == rq) { for (int d = ld; d < rd; d++) if (xds[lq * D + d] < l) sum++; } else { for (int d = ld; d < D; d++) if (xds[lq * D + d] < l) sum++; for (lq++; lq < rq; lq++) { int k = lower_bound(gds[lq], gds[lq] + D, l) - gds[lq]; sum += k; } for (int d = 0; d < rd; d++) if (xds[rq * D + d] < l) sum++; } printf("%d\n", sum); } return 0; }