Matrix
题目描述
数据范围
题解
这一题,挺水的,比赛时一眼就看出了题解,经过验证后证明我的做法是对的,切掉。O(∩_∩)O~~
我们单独考虑第一列和第一行上的数但答案的单独贡献。
首先,(
1
,
然后,某个位置对答案的贡献就等于该位置所有走到(
n
,
一次往右走,我们可以视为乘
a
,向下走,我们可以视为乘
经过推算,可得出以下显然的结论:
(
i
,
(
1
,
相信大家知道,从(
i
,
然后从(
i
,
Cn−i2∗n−i−2 = (2∗n−i−2)!(n−2)!∗(n−i)! mod ( 109 + 7 )
Code(Pascal)
const
mo=1000000007;
var
n,i:longint;
a,b,ans,kkk:int64;
ycl,ny:array[0..300000] of int64;
h,z,aa,bb:array[0..150000] of int64;
function ksm(o,t:int64):int64;
var
cqy:int64;
begin
cqy:=1;
while t>0 do
begin
if t mod 2=1 then cqy:=(cqy*o) mod mo;
o:=(o*o) mod mo;
t:=t div 2;
end;
exit(cqy);
end;
begin
readln(n,a,b);
for i:=1 to n do
read(z[i]);
readln;
for i:=1 to n do
read(h[i]);
ycl[0]:=1;
for i:=1 to 2*n do
ycl[i]:=ycl[i-1]*i mod mo;
aa[0]:=1;
for i:=1 to n do
aa[i]:=(aa[i-1]*a) mod mo;
bb[0]:=1;
for i:=1 to n do
bb[i]:=(bb[i-1]*b) mod mo;
for i:=1 to n do
ny[i]:=ksm(ycl[i],mo-2);
ny[0]:=1;
ans:=0;
for i:=2 to n do
begin
kkk:=h[i]*ycl[2*n-i-2] mod mo;
kkk:=kkk*(ny[n-i]*ny[n-2] mod mo) mod mo;
kkk:=kkk*(bb[n-1]*aa[n-i] mod mo);
ans:=(ans+kkk) mod mo;
end;
for i:=2 to n do
begin
kkk:=z[i]*ycl[2*n-i-2] mod mo;
kkk:=kkk*(ny[n-i]*ny[n-2] mod mo) mod mo;
kkk:=kkk*(aa[n-1]*bb[n-i] mod mo);
ans:=(ans+kkk) mod mo;
end;
writeln(ans);
end.