题目大意:求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;}
时间: 2024-11-08 19:25:12