上午小測2 A. Matrix 數學
阿新 • • 發佈:2020-10-29
題目描述
分析
程式碼
#include<cstdio> #define rg register inline int read(){ rg int x=0,fh=1; rg char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') fh=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*fh; } const int maxn=5e3+5,maxm=1e6+5; const int mod=1e9+7; int f[maxn][maxn],n,a,b,l[maxm],t[maxm]; int ksm(int ds,int zs){ int ans=1; while(zs){ if(zs&1) ans=1LL*ans*ds%mod; ds=1LL*ds*ds%mod; zs>>=1; } return ans; } int ny[maxm],jc[maxm],jcc[maxm]; int getC(int nn,int mm){ return 1LL*jc[nn]*jcc[mm]%mod*jcc[nn-mm]%mod; } int main(){ n=read(),a=read(),b=read(); if(n<=5000){ for(rg int i=1;i<=n;i++){ f[1][i]=read(); } for(rg int i=1;i<=n;i++){ f[i][1]=read(); } for(rg int i=2;i<=n;i++){ for(rg int j=2;j<=n;j++){ f[i][j]=1LL*a*f[i-1][j]%mod+1LL*b*f[i][j-1]%mod; if(f[i][j]>=mod) f[i][j]-=mod; } } printf("%d\n",f[n][n]); } else if(a==0){ for(rg int i=1;i<=n;i++){ l[i]=read(); } for(rg int i=1;i<=n;i++){ t[i]=read(); } rg int nans=1LL*t[n]*ksm(b,n-1)%mod; printf("%d\n",nans); } else { for(rg int i=1;i<=n;i++){ l[i]=read(); } for(rg int i=1;i<=n;i++){ t[i]=read(); } ny[1]=1; for(rg int i=2;i<maxm;i++){ ny[i]=1LL*(mod-mod/i)*ny[mod%i]%mod; } jc[0]=jcc[0]=1; for(rg int i=1;i<maxm;i++){ jc[i]=1LL*jc[i-1]*i%mod; jcc[i]=1LL*jcc[i-1]*ny[i]%mod; } rg int now,ans=0; for(rg int i=2;i<=n;i++){ now=1LL*getC(n+n-2-i,n-2)%mod*ksm(a,n-1)%mod*ksm(b,n-i)%mod; ans+=1LL*now*l[i]%mod; ans%=mod; } for(rg int i=2;i<=n;i++){ now=1LL*getC(n+n-2-i,n-2)%mod*ksm(b,n-1)%mod*ksm(a,n-i)%mod; ans+=1LL*now*t[i]%mod; ans%=mod; } printf("%d\n",ans); } return 0; }