#include "cstdio"
#include "iostream"
using namespace std;
#define maxn 2002
#define MOD 1000000007
#define LL long long
LL stirling[maxn][maxn];
LL calstirling(int n,int k){
if(stirling[n][k]!=-1) return stirling[n][k];
if(k>n) return stirling[n][k]=0;
if(n>0&&k==0) return stirling[n][k]=0;
if(n>=0&&n==k) return stirling[n][k]=1;
return stirling[n][k]=(calstirling(n-1,k-1)+(n-1)*calstirling(n-1,k))%MOD;
}
LL cb[maxn][maxn];
LL calc(int n, int k) {
if (!k || n == k) return 1;
if (~cb[n][k]) return cb[n][k];
return cb[n][k] = (calc(n - 1, k - 1) + calc(n - 1, k)) % MOD;
}
int main(){
int n,f,b;
int t;
scanf("%d",&t);
for(int i=0;i<2002;i++) for(int j=0;j<2002;j++) cb[i][j]=stirling[i][j]=-1;
/*
for(int i=0;i<2002;i++){
for(int j=0;j<=i;j++){
printf("%lld ",calstirling(i,j));
}
printf("\n");
}*/
while (t--) {
scanf("%d%d%d",&n,&f,&b);
LL ans=0;
//printf("%lld %lld\n",calstirling(n-1,f+b-2),calc(f+b-2,f-1));
if(f+b-2<=2000)
ans=(calstirling(n-1,f+b-2)*calc(f+b-2,f-1)%MOD+MOD)%MOD;
printf("%lld\n",ans);
//printf("%lld\n",(calstirling(n-1,f+b-2)*calc(f+b-2,f-1)%MOD+MOD)%MOD);
}
return 0;
}
HDU 4372 Count the Buildings
最新推荐文章于 2018-01-23 15:20:00 发布