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

 

 

 

你可能感兴趣的:(count)