ZOJ 3624 Count Path Pair 排列组合

思路:在没有限制条件时,很容易知道结果为C(m+n,n)*C(m+q-p,q).

然后再把相交的情况去除就可以了。而如果想到了就是水题了……

求A->D,B->C相交的情况可以转化为求A->C,B->D的情况。

所以结果就为C(m+n,n)*C(m+q-p,q)-C(m+q,m)*C(m+n-p,n).

代码:

 

#include<cstdio>
#include<algorithm>
#define M 200001
#define mod 100000007
#define ll long long
using namespace std;
ll inv(ll x)
{
    if(x==1) return 1;
    return inv(mod%x)*(mod-mod/x)%mod;
}
ll C(ll a,ll b)
{
    ll u=1,v=1,i,t;
    t=max(b,a-b);
    for(i=0;i<t;i++){
        u=u*(a-i)%mod;
        v=v*(i+1)%mod;
    }
    return u*inv(v)%mod;
}
int main()
{
    ll m,n,q,p;
    while(scanf("%lld%lld%lld%lld",&m,&n,&p,&q)!=EOF){
        ll ans=C(m+n,m)*C(m+q-p,q)%mod-C(m+q,m)*C(m+n-p,n)%mod;
        if(ans<0) ans=(ans+mod)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}
View Code

 

 

 

转载于:https://www.cnblogs.com/xin-hua/p/3424857.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值