思路:在没有限制条件时,很容易知道结果为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; }