//SPOJ-PGCD
//给n,m求gcd(i,j)为质数的个数
//莫比乌斯反演
//积性函数分析,f(ap) p=p':... p!=p': ...
#include
#include
using namespace std;
#define ll long long
int const N=1e7+5;
int prime[N],primesize,mu[N];
int sum[N];
int f[N];
bool isprime[N];
//线性筛可以预处理prime和isprime
//在这过程中可以预处理积性函数f, 比如mu phi d
//4个加代码的地方要自己加 要取模就每一步都取模
//比如预处理欧拉函数 预处理mu,均有模板
//反演的题会用到这个
//prime从prime[1]开始
int Mobius()
{
mu[1] = 1;
int pnum = 0;
for(int i = 2; i < N; i++)
{
if(!isprime[i])
{
prime[pnum ++] = i;
mu[i] = -1;
f[i] = 1;
}
for(int j = 0; j < pnum && i * prime[j] < N; j++)
{
isprime[i * prime[j]] = true;
if(i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
f[i * prime[j]] = mu[i];
break;
}
mu[i * prime[j]] = -mu[i];
f[i * prime[j]] = mu[i] - f[i];
}
sum[i] = sum[i - 1] + f[i];
}
}
void getlist(int listsize)//预处理的范围 指i*prime[j]的最大值
{
memset(isprime,1,sizeof(isprime));
isprime[1]=false;
mu[1]=1;
mu[0]=0;
//A从2开始,所以这里加f(1)=?;
f[1]=0;
for(int i=2; i<=listsize; i++)
{
if(isprime[i])
{
prime[++primesize]=i;
//B加代码 质数的情况
mu[i]=-1;
f[i]=1;
}
//这里的prime[j]一定是最小质因子
for(int j=1; j<=primesize&&i*prime[j]<=listsize; j++)
{
isprime[i*prime[j]]=false;
if(i%prime[j]==0)
{
//C加代码 不互素的情况 一般考虑f(p^k)与p的关系
mu[i*prime[j]] = 0;
f[i*prime[j]]=mu[i];
break;
}
else
{
//D加代码 互素的情况
mu[i*prime[j]] = -mu[i];
f[i*prime[j]]=mu[i]-f[i];
}
}
//E可加前缀和代码
sum[i]=f[i]+sum[i-1];
// mu[i]+=mu[i-1];
}
sum[0]=0;
sum[1]=0;
// for(int i=1; i<=N-2; i++)
// sum[i]=f[i]+sum[i-1];
}
int main()
{
getlist(N-2);
int T=0;
scanf("%d",&T);
while(T--)
{
int l,r;
scanf("%d %d",&l,&r);
ll ans = 0;
if(l > r)
swap(l, r);
for(int i=1, last=0; i<= l;i=last+1)
{
last = min(l/(l/i), r/(r/i));//分块
ans += 1ll*(l/i)*(r/i)*(sum[last]-sum[i - 1]);
}
printf("%lld\n",ans);
}
}