样例全过了,但是交上去全WA
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5,mod=1e9+7;
int mul[N],f[N],sumul[N],sumf[N];
int prime[N],len;
bool isprime[N];
inline int ope(int A,int B){
int l=1,r=min(A,B),ans=0;
while( l<=r ){
int l1=A/(A/l), l2=B/(B/l);
l1=min(l1,l2);
ans+=(A/l)*(B/l)*(sumul[l1]-sumul[l-1]);
l=l1+1;
}
return ans;
}
inline int fast_pow(int base,int p){
int ans=1;
while( p ){
if( p&1 )
ans=ans*base%mod;
base=base*base%mod;
p>>=1;
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
mul[1]=1;
for(int i=2;i<N;i++){
if( !isprime[i] ){
prime[++len]=i;
mul[i]=-1;
}
for(int j=1;j<=len && prime[j]*i<N;j++){
isprime[i*prime[j]]=1;
if( i%prime[j]==0 ){
mul[i*prime[j]]=0;
break;
}
mul[i*prime[j]]=-mul[i];
}
}
f[1]=f[2]=1;
for(int i=3;i<N;i++)
f[i]=(f[i-1]+f[i-2])%mod;
sumf[0]=1;
for(int i=1;i<N;i++){
sumul[i]=sumul[i-1]+mul[i];
sumf[i]=(sumf[i-1]*f[i])%mod;
}
int T;
cin>>T;
while( T-- ){
int n,m;
cin>>n>>m;
if( n>m )
swap(n,m);
int l=1,r=n,ans=1;
while( l<=r ){
int l1=n/(n/l);
ans=ans*fast_pow(sumf[l1]*fast_pow(sumf[l-1],mod-2)%mod,ope(n/l,m/l))%mod;
l=l1+1;
}
cout<<ans<<"\n";
}
return 0;
}