思路:在沒有限制條件時,很容易知道結果爲C(m+n,n)*C(m+q-p,q).ide
而後再把相交的狀況去除就能夠了。而若是想到了就是水題了……spa
求A->D,B->C相交的狀況能夠轉化爲求A->C,B->D的狀況。code
因此結果就爲C(m+n,n)*C(m+q-p,q)-C(m+q,m)*C(m+n-p,n).blog
代碼:it
#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; }