题目大意
解题思路
显然每个l和t的贡献是独立的,向右走就是乘一个a,向下走就是乘一个b,走到终点的a和b的个数可以算出来,系数就是走到终点的方案数,用组合数算就行了。
code
using namespace std;
int const maxn=100000 ,maxk=60 ,inf=2147483647 ;
LL n,a,b,l[maxn+10 ],t[maxn+10 ],aa[maxn+10 ],bb[maxn+10 ],ta[maxn*2 +10 ],mod=1000000007 ;
LL Pow(LL x ,int y ){
LL z=1 ;
for (;y ;){
if (y &1 )z=(z*x )%mod ;
x =(x *x )%mod ;
y /=2 ;
}
return z;
}
LL c(LL x ,LL y ){
return ((ta[x ]*Pow (ta[y ],mod-2 ))%mod *Pow (ta[x -y ],mod-2 ))%mod ;
}
int main(){
freopen("d.in" ,"r" ,stdin);
freopen("d.out" ,"w" ,stdout);
scanf("%lld %lld %lld " ,&n,&a,&b);
aa[0 ]=bb[0 ]=ta[0 ]=ta[1 ]=1 ;
fo(i,1 ,n)scanf("%lld " ,&l[i]),aa[i]=(aa[i-1 ]*a )%mod ;
fo(i,1 ,n)scanf("%lld " ,&t[i]),bb[i]=(bb[i-1 ]*b )%mod ;
fo(i,2 ,n*2 )ta[i]=(ta[i-1 ]*i )%mod ;
LL ans=0 ;
if (n==1 ){
printf ("%lld " ,l[1 ]);
return 0 ;
}
fo(i,2 ,n)
ans=(ans+((((l[i]*aa [n-1 ])%mod *bb [n-i])%mod +((t[i]*aa [n-i])%mod *bb [n-1 ])%mod )*c (n-2 +n-i,n-i))%mod )%mod ;
printf ("%lld " ,ans);
return 0 ;
}