[SDOI2017]数字表格

题目描述:

不会打连乘TAT

题目分析:

rXrEu.png

题目链接:

(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值