//筛一遍所有质数 再用二分法查找范围内的质数个数
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N = 10000010;
vector<int> primes;
bool st[N];
void init()
{
for(int i = 2; i <= N; i++) {
if(!st[i]) primes.push_back(i);
for(int p : primes)
{
if(i * p > N) break;
st[i * p] = true;
if(i % p == 0) break;
}
}
}
int main()
{
init();
int T;
cin >> T;
while(T--)
{
int x, y;
cin >> x >> y;
//二分法查找第一个大于等于x的数的下标
//查找第一个小于等于y的数的下标
int l = 0, r = primes.size() - 1;
while(l < r)
{
int mid = l + r >> 1;
if(primes[mid] >= x) r = mid;
else l = mid + 1;
}
int l1 = 0, r1 = primes.size() - 1;
while(l1 < r1)
{
int mid = l1 + r1 + 1 >> 1;
if(primes[mid] <= y) l1 = mid;
else r1 = mid - 1;
}
//cout << primes[l1];
if(primes[l1] > y) cout << l1 - l << endl;
else if(primes[l] < x) cout << l1 - l << endl;
else if(primes[l1] > y && primes[l] < x) cout << l1 - l - 1 <<endl;
else cout << l1 - l + 1 << endl;
}
return 0;
}