上午小测2 A. Matrix 数学

题目描述



分析

代码

#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;
}
posted @ 2020-10-29 11:32  liuchanglc  阅读(183)  评论(0编辑  收藏  举报