牛客noip2018练习赛5 C串串

题意:

告诉你S,T分别有多少01,问多少对S,T满足T是S的子序列。

题解:

牛客noip2018练习赛5 C串串

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
const LL mod=1e9+7;
LL a,b,c,d,ans,C[4010][4010];
void pre()
{
	for(LL i=0;i<=4000;i++)
	{
		C[i][0]=1;
		for(LL j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
	}
}
LL calc(LL x,LL y)
{
	if(x==0) return 1;
	if(y==0) return 0;
	return C[x+y-1][y-1];
}
int main()
{
	pre();
	scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
	a-=c;b-=d;LL ans=0;
	for(LL i=0;i<=a;i++)
		for(LL j=0;j<=b;j++)
		{
			LL t1=a-i,t2=b-j;
			(ans+=C[i+j][i]*calc(t2,c)%mod*calc(t1,d)%mod)%=mod;
		}
	printf("%lld",ans*C[c+d][d]%mod);
}