UVa 12034 (递推) Race

题意:

有n个人赛马,名次可能并列,求一共有多少种可能。

分析:

设所求为f(n),假设并列第一名有i个人,则共有C(n, i)种可能,接下来确定后面的名次,共有f(n-1)种可能

所以递推关系为:

 1 #include <cstdio>
 2 
 3 const int maxn = 1000;
 4 int C[maxn+1][maxn+1], f[maxn+1];
 5 const int M = 10056;
 6 
 7 void Init()
 8 {
 9     //递推组合数
10     for(int i = 0; i <= maxn; ++i)
11     {
12         C[i][0] = C[i][i] = 1;
13         for(int j = 1; j < i; ++j)
14             C[i][j] = (C[i-1][j-1] + C[i-1][j]) % M;
15     }
16     //递推f
17     f[0] = 1;
18     for(int i = 1; i <= maxn; ++i)
19         for(int j = 1; j <= i; ++j)
20             f[i] = (f[i] + C[i][j] * f[i-j]) % M;
21 }
22 
23 int main()
24 {
25     Init();
26     int T;
27     scanf("%d", &T);
28     for(int kase = 1; kase <= T; ++kase)
29     {
30         int n;
31         scanf("%d", &n);
32         printf("Case %d: %d
" ,kase, f[n]);
33     }
34 
35     return 0;
36 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4177949.html