ZOJ 4770 Count Path Pair(组合)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4770

题意:给出m,n,p,q。一个m*n的方格,p<m,q<n。一个人从A(0,0)走到D(m,n),路径设为g,另一个人从B(p,0)走到C(m,q),路径设为f,只能向上或者向右走。求不相交的二元组(g,f)的个数。

思路:总数为C(n+m,n)*C(m-p+q,q),然后减去相交的,为C(q+m,q)*C(n+m-p,n)。

 

i64 a[N];



void init()

{

    a[0]=1;

    int i;

    for(i=1;i<N;i++) a[i]=a[i-1]*i%mod;

}



i64 C(i64 x,i64 y)

{

    return a[x]*reverse(a[y]*a[x-y]%mod,mod)%mod;

}



int m,n,p,q;



int main()

{

    init();

    while(scanf("%d%d%d%d",&m,&n,&p,&q)!=-1)

    {

        i64 ans=C(n+m,m)*C(q+m-p,q)%mod-C(m+q,m)*C(m-p+n,n)%mod;

        if(ans<0) ans+=mod;

        printf("%lld\n",ans);

    }

}

  

你可能感兴趣的:(count)