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
",ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3424857.html