UVA.12034 Race (递推)
题意分析
现在有
n
个人比赛,可以有并列,求解有多少种排名方案。
如当
考虑这样一件事情,首先要确定一下出来有多少个并列第一名,有 i 种方案
每种方案有
对于某一种情况,我们只是确定了第一名,没有确定其他名的情况,这样考虑。
现在剩下 n−i 个人没有比赛,相当于看 n−i 个人排名有多少情况,我们用 ans[k] 表示有 k 个人的方案总数。
不难得到最后的公式:
不要忘记边求取模。
代码总览
#include <bits/stdc++.h>
#define nmax 1005
#define MOD 10056
using namespace std;
int c[nmax][nmax];
int ans[nmax];
void init(){
for(int i = 0;i<nmax;++i){
c[i][0] = 1;
for(int j = 1;j<=i;++j) c[i][j] = (c[i-1][j-1] + c[i-1][j]) % MOD;
}
ans[0] = ans[1] = 1;
for(int i = 2;i<nmax;++i)
for(int j = 1;j<=i;++j)
ans[i] = (ans[i] + (c[i][j] * ans[i-j] ) % MOD) % MOD;
}
int main()
{
int t ,n;
scanf("%d",&t);
init();
for(int kase = 1;kase <=t;++kase){
scanf("%d",&n);
printf("Case %d: %d\n",kase,ans[n]);
}
return 0;
}