题解 AT3576 【Popping Balls】
组合计数
据题意,每当从0拿球,
当
考虑判断一个状态是否合法。当拿到第一个蓝球时,
枚举从
代码:
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstring>
#define ll long long
#define maxn 5005
#define p 1000000007
#define re(i,a,b) for(int i=a;i<=b;i++)
#define for_edge(x) for(int i=head[x];i;i=e[i].nxt)
using namespace std;
inline int read(){char c=getchar();int f=1;int ans = 0;while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}while(c<='9'&&c>='0'){ans =ans*10+c-'0';c=getchar();}return ans*f;}
//_____________________________________________________________________________________________________
ll _C[maxn][maxn];
inline ll C(int n,int m)
{
return (n>=0 && m>=0) ? _C[n][m] : 0;
}
int main()
{
int A = read() , B = read();;
_C[0][0] = 1;
re(i,0,5000)
re(j,0,i)
{
_C[i][j] %= p;
_C[i+1][j] += _C[i][j];
_C[i+1][j+1] += _C[i][j];
}
ll ans = 0;
re(i,1,B)
re(j,1,B-i)
( ans += C(B-1,i-1)*C(B-i-1,j-1)%p * C( A-2*B+2*i+j+2,2 ) )%=p;
(ans += A+1)%=p;
printf("%lld\n",ans);
return 0;
}