UVA-12304 Race(递推)
题目大意:求n个人比赛的所有可能的名次种数。比如:n=2时,有A第一B第二、B第一A第二、AB并列第一三种名次。
题目解析:既然是比赛,总有第一名。第一名的人数可能是i (1≤i≤n),则剩下待定的人数就是n-i......
设 f(n)为n个人比赛时的名次种数。则 f(n)= ∑ C(n,i)f(n-i) (1≤ i ≤n)
这道题和前一道 “How to add?” 类似。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int mod=10056;
int c[1005][1005];
int f[1005];
void init()
{
int i,j;
c[1][0]=c[1][1]=1;
for(i=2;i<=1000;++i){
c[i][0]=1;
for(j=1;j<=i;++j)
c[i][j]=(c[i-1][j]%mod+c[i-1][j-1]%mod)%mod;
}
}
void init1()
{
memset(f,0,sizeof(f));
int i,j;
f[0]=0;
f[1]=1;
for(i=2;i<=1000;++i){
for(j=i;j>=1;--j){
f[i]+=(c[i][j]*f[i-j]);
f[i]%=mod;
}
++f[i];
f[i]%=mod;
}
}
int main()
{
//freopen("UVA-12034 Race.txt","r",stdin);
init();
init1();
int T,i,n,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("Case %d: %d\n",++cas,f[n]);
}
return 0;
}