Vijos 1943 上学路上 容斥+组合数+逆元法

题意简述
给定一个正交网格图和四个坐标 (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,y210,0000


分析
若考虑可以相交的情况,则有 Cx1x1+y1Cx2x2+y2 种方案
而相交的方案有 Cx1x1+y2Cx2x2+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.

你可能感兴趣的:(解题报告,vijos)