题目描述:
不会打连乘TAT
题目分析:
题目链接:
(Luogu 3704)[https://www.luogu.org/problemnew/show/P3704]
AC 代码:
#include <cstdio>
#include <iostream>
#define il inline
const int mod=1e9+7;
const int maxm=1e6+100;
int fib[maxm+10],g[maxm+10];
int sum[maxm+10],inv[maxm+10];
il int fast_pow(int x,int y)
{
int ans=1;
while(y)
{
if(y%2) ans=(1ll*ans%mod*x%mod)%mod;
x=(1ll*x%mod*x%mod)%mod;
y/=2;
}
return ans;
}
il void pre()
{
fib[1]=fib[2]=g[1]=g[2]=1;
for(int i=3;i<=maxm;i++) fib[i]=(fib[i-1]+fib[i-2])%mod,g[i]=fib[i];
for(int i=1;i<=maxm;i++)
{
int inv=fast_pow(g[i],mod-2);
for(int j=i*2;j<=maxm;j+=i) g[j]=1ll*g[j]*inv%mod;
}
inv[0]=sum[0]=1;
for(int i=1;i<=maxm;i++) sum[i]=1ll*sum[i-1]*g[i]%mod,inv[i]=fast_pow(sum[i],mod-2);
}
il void work()
{
int n,m;
scanf("%d%d",&n,&m);
int ans=1,last=0;
for(int i=1;i<=std::min(n,m);i=last+1)
{
last=std::min(n/(n/i),m/(m/i));
ans=1ll*ans*fast_pow(1ll*sum[last]*inv[i-1]%mod,1ll*(n/i)*(m/i)%(mod-1))%mod;
}
printf("%d\n",ans);
}
int main()
{
pre();
int t;
scanf("%d",&t);
while(t--)
work();
return 0;
}