rt
#include<bits/stdc++.h>
#define MAXN 1000010
#define ll long long
using namespace std;
const ll mod=1000000007;
ll t;
bool vis[MAXN];
int mu[MAXN],prime[MAXN],s[MAXN];
ll pre[MAXN];
void init()
{
long long cnt=0;
mu[1]=1;
for(long long i=2;i<=MAXN;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
mu[i]=-1;
}
for(long long j=0;j<cnt&&i*prime[j]<=MAXN;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
else mu[i*prime[j]]=-mu[i];
}
}
for(long long i=1;i<=MAXN;i++) s[i]=(s[i-1]+mu[i])%mod;
ll a=0,b=1;
pre[0]=pre[1]=1;
for(int i=2;i<=MAXN;i++)
{
pre[i]=pre[i-1]*(a+b)%mod;
ll t=a%mod;
a=b%mod;
b=(a+t)%mod;
}
}
long long quickpow(long long a,long long x)
{
if(x==0) return 1;
long long tmp=quickpow(a,x>>1);
tmp=tmp*tmp%mod;
if(x&1) tmp=tmp*a%mod;
return tmp;
}
long long inv(long long a)
{
return quickpow(a,mod-2);
}
ll solve1(ll a,ll b)
{
ll ans=0;
if(a>b) swap(a,b);
for(int l=1,r=0;l<=a;l=r+1)
{
r=min(a/(a/l),b/(b/l));
ans=(ans+(s[r]-s[l-1])*(a/l)%mod*(b/l)%mod)%mod;
}
return ans;
}
ll solve2(ll a,ll b)
{
ll ans=1;
if(a>b) swap(a,b);
for(int l=1,r=0;l<=a;l=r+1)
{
r=min(a/(a/l),b/(b/l));
ans=ans*quickpow(pre[r]*inv(pre[l-1])%mod,solve1(a/l,b/l))%mod;
}
return ans;
}
int main()
{
init();
cin>>t;
while(t--)
{
ll n,m;
cin>>n>>m;
cout<<solve2(n,m)<<endl;
}
return 0;
}