先留着,晚上继续写
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 1000000;
const ll mod = 1e9+7;
int T,n,m;
ll f[maxn+5];
int vis[maxn+5],prime[maxn+5],mu[maxn+5];
int tot = 0;
int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
return x*f;
}
void init (){
mu[1]=1;
memset(vis, 0, sizeof(vis));
for (int i=2;i<=maxn;i++){
if (!vis[i]){
prime[++tot]=i;
mu[i]=-1;
f[i] = 1;
}
for (int j=1;j<=tot &&prime[j]*i<=maxn;j++){
vis[i*prime[j]] = 1;
if (i%prime[j]==0){
mu[i*prime[j]]=0;
f[i*prime[j]]=mu[i];
break;
}
else {
mu[i*prime[j]]=-mu[i];
f[i*prime[j]]=mu[i]-f[i];
}
}
}
for (int i=1;i<=maxn;i++){
f[i]+=f[i-1];
}
}
int main (){
init ();
cin >>T;
while (T--){
ll ans = 0;
scanf ("%d %d",&n,&m);
if (n>m) swap (n,m);
int last;
for (int i=1;i<=m;i=last+1){
last = min(n/(n/i),m/(m/i));
ans += (f[last]-f[i-1])*(n/i)*(m/i);
}
printf("%lld\n",ans);
}
return 0;
}