Jzoj4709 Matrix
十分套路,这种题很明显是单独计算每个元素的贡献来搞的
我们发现,对于ti,它最后到n,n的路线有C(2n-i-2,n-2)条
而对于每条路线,其值发生的变化都为t[i]*a^(n-i)*b^(n-1)
所以贡献就是∑t[i]*a^(n-i)*b^(n-1)*C(2n-i-2,n-2)
l的话差不多吧
快速求c(n,m)应该不用讲了吧
#include<stdio.h>
#define L long long
#define M 1000000007
L pow(L x,int k){
L s=1;
for(;k;x=x*x%M,k>>=1)
if(k&1) s=s*x%M;
return s;
}
L a[100010],b[100010],sa=1,sb=1,S=0;
int n,A,B;
L pa,pb,inv[200010],js[200010];
L C(int m,int n){
return js[m]*inv[m-n]%M*inv[n]%M;
}
int main(){
scanf("%d%d%d",&n,&A,&B);
for(int i=1;i<=n;++i) scanf("%d",a+i);
for(int i=1;i<=n;++i) scanf("%d",b+i);
pa=pow(A,n-1); pb=pow(B,n-1);
*js=*inv=1;
for(int i=1;i<=n<<1;++i){
js[i]=js[i-1]*i%M;
inv[i]=pow(js[i],M-2);
}
if(n==1){ return 0&printf("%d\n",a[1]); }
for(int i=n;i>1;--i){
L c=C(2*n-i-2,n-i);
S=(S+c*(a[i]*pa%M*sb%M+b[i]*pb%M*sa%M)%M)%M;
sa=sa*A%M; sb=sb*B%M;
}
printf("%lld\n",S);
}