一道大大的找规律题。
从每个l和t走到右下角,对于每个l、t,a和b的次数都是确定的,然后可以算出每个l和t走到右下角a和b的次数。
对于l走到右下角的a和b的状况会是 an−1bn−i ,t的状况会是 an−ibn−1 。
但是走到右下角的路径会有很多种情况,用组合数算一下就是 Cn−22∗n−i−2 。
所以预处理一下阶乘和阶乘的逆元就好了。
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int mo=1000000007,maxn=200007;
typedef long long ll;
ll i,j,k,n,m;
ll l[maxn],t[maxn],xi,shang,xia1,xia2,a,b;
ll jie[maxn],ni[maxn],cia[maxn],cib[maxn],ans;
ll qsm(ll x,ll y){
ll z=1;
while(y){
if(y&1)z=z*x%mo;
y/=2;
x=x*x%mo;
}
return z;
}
int main(){
// freopen("fan.in","r",stdin);
scanf("%lld%lld%lld",&n,&a,&b);
fo(i,1,n)scanf("%lld",&t[i]);
fo(i,1,n)scanf("%lld",&l[i]);
cia[0]=cib[0]=1;
fo(i,1,n){
cia[i]=(cia[i-1]*a)%mo;
cib[i]=(cib[i-1]*b)%mo;
}
jie[0]=1;
fo(i,1,2*n)jie[i]=jie[i-1]*i%mo;
ni[0]=ni[1]=1;
fo(i,2,2*n)ni[i]=qsm(jie[i],mo-2);
shang=4+(n-4)*2,xia1=shang/2,xia2=shang-xia1;
fo(i,2,n){
xi=jie[shang]*ni[xia1]%mo*ni[xia2]%mo;
ans=(ans+xi*l[i]%mo*cia[n-i]%mo*cib[n-1]%mo)%mo;
shang--,xia1--;xia2=shang-xia1;
}
shang=4+(n-4)*2,xia1=shang/2,xia2=shang-xia1;
fo(i,2,n){
xi=jie[shang]*ni[xia1]%mo*ni[xia2]%mo;
ans=(ans+xi*t[i]%mo*cib[n-i]%mo*cia[n-1]%mo)%mo;
shang--,xia1--;xia2=shang-xia1;
}
printf("%lld\n",ans);
}