您的位置:首页 > 产品设计 > UI/UE

hdu 4372 Count the Buildings(第一类斯特林数)

2017-11-08 21:40 393 查看
从前向后看可以看到F栋楼,去掉中间最高那栋楼,有F-1栋楼,看到的第一栋楼和看到的第二栋楼之间的楼,分给第一栋楼,属于同一组楼,后边的依次类推,共F-1组楼,对于每组楼,假设有X栋楼,去掉我们看到的这一栋楼固定在第一个位置(这一组最高的楼在最靠前的位置),剩下X-1栋楼随意排列,X-1栋楼的的排列就是X栋楼的环排列,这就分成了F-1个环排列,从后向前看的也是这样。这就是N栋楼形成了F+B-2个环排列,第一类斯特林数。

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2010;
const long long mod = 1e9+7;
long long C[MAXN][MAXN];
long long S[MAXN][MAXN];

void init()
{
C[0][0] = 1;
S[0][0] = 1;
for(int i = 1; i < MAXN; ++i)
{
C[i][i] = 1;
C[i][0] = 1;
S[i][i] = 1;
S[i][0] = 0;
for(int j = 1; j < i; ++j)
{
C[i][j] = (C[i-1][j] + C[i-1][j-1])%mod;
S[i][j] = ((i-1)%mod*S[i-1][j]%mod + S[i-1][j-1])%mod;
}
}
}

int main()
{
init();
int T,N,F,B;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d",&N,&F,&B);
if(F+B-1 > N)
{
puts("0");
continue;
}
printf("%lld\n",C[F+B-2][F-1]%mod*S[N-1][F+B-2]%mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: