#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <string>
#include <string.h>
#include <map>
#include <vector>
typedef long long LL ;
const int maxn = 10000000 ;
int prime[maxn+8] , primeSize ;
bool is[maxn+8] ;
int mu[maxn+8] ;
int sum[maxn+8] ;
void mobius(){
memset(is , 0 , sizeof(is)) ;
primeSize = 0 ;
is[1] = mu[1] = 1 ;
for(int i = 2 ; i <= maxn ; i++){
if(! is[i]){
prime[primeSize++] = i ;
mu[i] = -1 ;
}
for(int j = 0 ; j < primeSize && i * prime[j] <= maxn ; j++){
is[i * prime[j]] = 1 ;
if(i % prime[j] == 0){
mu[i * prime[j]] = 0 ;
break ;
}
mu[i*prime[j]] = -mu[i] ;
}
}
}
LL solve(LL big , LL les){
if(big < les) std::swap(big , les) ;
LL res = 0 ;
LL Lf , Rt ;
for(Lf = 1 ; Lf <= les ; Lf = Rt+1){
Rt = std::min(big/(big/Lf), les/(les/Lf)) ;
res += (sum[Rt] - sum[Lf-1]) * (big/Lf) * (les/Lf) ;
}
return res ;
}
int main()
{
std::ios::sync_with_stdio(false) ;
mobius() ;
sum[0] = 0 ;
for(int i = 1 ; i*i <= maxn ; i++){
int qu = i*i ;
for(int j = 1 ; j * qu <= maxn ; j++)
sum[qu * j] += mu[j] ;
}
for(int i = 1 ; i <= maxn ; i++) sum[i] += sum[i-1] ;
int t ;
LL n , m ;
scanf("%d" , &t) ;
while(t--){
scanf("%I64d%I64d" , &n , &m) ;
printf("%I64d\n" , n*m - solve(n , m) ) ;
}
return 0 ;
}