// 筛选法
// 先求出 sqrt(1<<31)内的素数
// 然后筛选出符合要求的数
// 详情见代码注释
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 1000010
#define maxm 48010
#define LL long long
int pr[maxm];
int p;
void getP(){
int i,j;
for(i=4;i<maxm;i+=2)
pr[i]=1;
for(i=3;i*i<maxm;i+=2)
if(!pr[i])
for(j=i*i;j<maxm;j+=i)
pr[j]=1;
pr[p++]=2; // printf("%d ",p);
for(i=3;i<maxm;i+=2)
if(!pr[i]) pr[p++]=i;//,printf("%d ",i);
}
int fac[maxn],f[maxn],lt[maxn];
int main(){
getP();
int T;
int A,B;
LL tp;
scanf("%d",&T);
int i;
LL j,k;
while(T--){
scanf("%d %d",&A,&B);
LL len=B-A;
for(i=0;i<=len;i++) fac[i]=0,f[i]=false,lt[i]=A+i;
tp=1;
for(i=1;i<p;i++){ // 素数从 3 开始 因为偶数时不可能符合要求的
tp=tp*pr[i]*pr[i];
if(tp>B) break;
for(j=(A-1+pr[i])/pr[i];j*pr[i]<=B;j++)
{
k=j*pr[i];
if(j%pr[i]==0) f[k-A]=true;// 去掉 平方因子
if((j*pr[i]-1)%(pr[i]-1)!=0) f[k-A]=true; // 条件3
fac[k-A]++; // 条件 2
lt[k-A]=lt[k-A]/pr[i];可能出现比sqrt(1<<31)大的素因子,所以需要知道
}
tp=1;
}
int ans=0;
for(i=0;i<=len;i++)// 这里就写的比较繁杂了 就是各种情况讨论
if(!f[i]){
if(fac[i]==2&<[i]>1){
tp=i+A;
if((tp-1)%(lt[i]-1)==0)
ans++;
}else if(fac[i]>2){
tp=i+A;
if(lt[i]==1) ans++;
else
if((tp-1)%(lt[i]-1)==0)
ans++;
}
}
printf("%d
",ans);
}
}