题意:
有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 }