Description
Analysis
这题是水数学题。
可以暴力手玩一下,于是可以发现神奇的规律。
当然,更可以感性地推导出
Fn,n
。
网格、递推式,你想到了什么?
网格中一点走到另一点的方案数!
但是这是改编的,有点不同。
首先对于任意一个位置的值往右走等价于乘
a
,往下走等价于乘
系数呢?显然就是方案数。但是(1,i)不能走到(1,i+1),(i,1)不能走到(i+1,1),所以把(1,i)或(i,1)的坐标移右(下)一格再计算。对于(0,0)往右或往上走到(n,m)的方案数,为
Cnm+n
Code
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const ll N=100010,mo=1e9+7;
ll n,a,b,l[N],t[N],fac[N*2];
ll qmi(ll x,ll n)
{
ll t=1;
for(;n;n>>=1)
{
if(n&1==1) t=t*x%mo;
x=x*x%mo;
}
return t;
}
ll ny(ll x)
{
return qmi(x,mo-2);
}
ll C(ll m,ll n)
{
return fac[m]*ny(fac[n]*fac[m-n]%mo)%mo;
}
int main()
{
scanf("%lld %lld %lld",&n,&a,&b);
fo(i,1,n) scanf("%lld",&l[i]);
fo(i,1,n) scanf("%lld",&t[i]);
if(n==1)
{
printf("%lld",l[1]);
return 0;
}
fac[0]=1;
fo(i,1,2*n) fac[i]=fac[i-1]*i%mo;
ll x=0,y=0;
fo(i,2,n)
{
ll c=C(2*n-i-2,n-2);
x=(x+c*l[i]%mo*qmi(b,n-i)%mo)%mo,y=(y+c*t[i]%mo*qmi(a,n-i))%mo;
}
printf("%lld",(qmi(a,n-1)*x%mo+qmi(b,n-1)*y%mo)%mo);
return 0;
}