做了一晚上了,改不出来了/qwq,求改
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<stack>
#include<map>
#include<cmath>
#define int long long
using namespace std;
const int N=1e6+9;
const int M=1e6;
const int mod=1e9+7;
int mu[N];
int sum[N];
int g[N];//做fib的逆元
int fib[N];
int prime[N],cnt;
int Te[N];//总的预处理
int T,n,m;
bool vis[N];
int read()
{
int f=1,x=0;
char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar(); }
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^'0');s=getchar();}
return f*x;
}
int quick(int x,int p)
{
int ret=1;
while(p)
{
if(p&1) ret=x*ret%mod;
x=x*x%mod;
p>>=1;
}
return ret%mod;
}
void get_mu()
{
fib[1]=1;
fib[0]=0;
mu[1]=1;
Te[1]=Te[0]=1;
g[1]=1;
for(int i=2;i<=M;i++)
{
Te[i]=1;//防止乘的时候死了
if(!vis[i])
{
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&prime[j]<=M/i;j++)
{
vis[i*prime[j]]=true;
if(i%prime[j]==0)
break;
else
mu[i*prime[j]]=-mu[i];
}
}
}
void prepare()
{
for(int i=2;i<=M;i++) fib[i]=(fib[i-1]%mod+fib[i-2]%mod)%mod;
for(int i=2;i<=M;i++) g[i]=quick(fib[i],mod-2);
for(int i=2;i<=M;i++)
{
if(mu[i]==0) continue;//既然mu[i]是0,那么mu[ki]一定是0,不需要管
for(int j=i;j<=M;j+=i)//d|n 的性质进行查找
{
if(mu[i]==1)//原数
Te[j]=Te[j]*1ll*fib[j/i]%mod;
if(mu[i]==-1)//逆元
Te[j]=Te[j]*1ll*g[j/i]%mod;
}
}
for(int i=1;i<=M;i++)
Te[i]=Te[i]*Te[i-1]%mod;
return;
}
signed main()
{
T=read();
get_mu();
prepare();
while(T--)
{
int ans=1;
n=read();
m=read();
if(n>m) swap(n,m);
for(int l=1,r=1;l<=n;l=r+1)
{
r=min((n/(n/l)),(m/(m/l)));
int in=(Te[r]*quick(Te[l-1],mod-2)%mod);
ans=ans*1ll*quick(in,(n/l)*(m/l)%(mod-1))%mod;
}
printf("%lld\n",(ans+mod)%mod);
}
return 0;
}