Description
给定两个长度为 n n 的整数序列 l l 和 t t ,分别作为 n×n n×n 矩阵 F F 的第一列和第一行,并且保证 l1=t1 l1=t1 。同时矩阵中的任意其他元素 Fi,j Fi,j 由以下递推给定:
Fi,j=a⋅Fi,j−1+b⋅Fi−1,jFi,j=a⋅Fi,j−1+b⋅Fi−1,j
给定系数 a,b, a,b, 要求计算 Fn,n Fn,n 模 109+7 109+7 的值。
Input
第一行包含三个整数 n,a,b n,a,b。
第二行包含 n n 个整数 li li。
第三行包含 n| n|个整数 ti ti。
Output
共一行包括一个整数,表示 Fn,n Fn,n 模 109+7 109+7 的值。
Sample Input
4 3 5
4 1 7 3
4 7 4 8
Sample Output
59716
Data Constraint
n,a,b,li,ti≤100000n,a,b,li,ti≤100000。
Solution
可以看出,对于每项都有固定的曼哈顿距离到达终点,因此他们关于 a,b a,b 的系数是固定的。
再者还要算出每一项到达终点的路径数。
所以对于每一项 ti ti 的贡献有 Cn−22n−i−2∗an−i∗bn−1 C2n−i−2n−2∗an−i∗bn−1, li li 的贡献则类似。
Code
const mo=1000000007;
var n,i:longint;
ans,t,k,x,y:int64;
c,a,b,l,r:array[0..100005] of int64;
function ni(x:int64):int64;
var y,ans:int64;
begin
y:=mo-2;
ans:=1;
while y<>0 do begin
if y mod 2=1 then ans:=ans*x mod mo;
x:=x*x mod mo;
y:=y div 2;
end;
exit(ans);
end;
begin
readln(n,a[1],b[1]);
dec(n);
for i:=n downto 0 do read(r[i]);readln;
for i:=n downto 0 do read(l[i]);
k:=1;t:=1;
while k<n do begin
t:=t*k mod mo;
k:=k+1;
end;
x:=1;y:=t*n mod mo;
c[0]:=1;c[1]:=n;
for i:=2 to n-1 do begin
x:=x*i mod mo;
y:=y*(i+n-1) mod mo;
c[i]:=y*ni(t*x mod mo) mod mo;
end;
a[0]:=1;b[0]:=1;
for i:=2 to n do begin
a[i]:=a[i-1]*a[1] mod mo;
b[i]:=b[i-1]*b[1] mod mo;
end;
for i:=0 to n-1 do begin
ans:=(ans+c[i]*l[i] mod mo *a[i] mod mo*b[n] mod mo) mod mo;
ans:=(ans+c[i]*r[i] mod mo *a[n] mod mo*b[i] mod mo) mod mo;
end;
writeln(ans);
end.