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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值