题意简述
给定一个正交网格图和四个坐标
(x1,0)
,
(x2,0)
,
(0,y1)
,
(0,y2)
满足
x1<x2
且
y1<y2
。现要求在网格图上找到两条最短路径,一条从
(x1,0)
到
(0,y1)
,另一条从
(x2,0)
到
(0,y2)
,且两条最短路径不相交,求所有的合法方案种数(对
109+7
取模)。(
0<x1,x2,y1,y2≤10,0000
)
分析
若考虑可以相交的情况,则有
Cx1x1+y1∗Cx2x2+y2
种方案
而相交的方案有
Cx1x1+y2∗Cx2x2+y1
(可等效为一条从
(x1,0)
到
(0,y2)
,另一条从
(x2,0)
到
(0,y1)
)
相减即为合法方案数。
求逆元的方法请参见此文,以下代码使用了第三种方法。
const
mo=1000000007;
var
x1,x2,y1,y2,i:longint;
fac:array[0..200020] of int64;
function ni(t:longint):int64;
var k:longint;
begin
if t=1 then exit(1);
k:=mo div t+1;
ni:=k*ni(k*t-mo) mod mo;
end;
function c(n,k:longint):int64;
begin
exit(fac[n]*ni(fac[k])mod mo*ni(fac[n-k])mod mo);
end;
begin
fac[0]:=1;
for i:=1 to 200020 do fac[i]:=fac[i-1]*i mod mo;
readln(x1,x2,y1,y2);
writeln(((c(x1+y1,x1)*c(x2+y2,x2)mod mo-c(x1+y2,x1)*c(x2+y1,x2)mod mo)mod mo+mo)mod mo);
end.