题意:
有n个人赛马,名次可能并列,求一共有多少种可能。
分析:
设所求为f(n),假设并列第一名有i个人,则共有C(n, i)种可能,接下来确定后面的名次,共有f(n-1)种可能
所以递推关系为:
1 #include2 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 //递推f17 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\n" ,kase, f[n]);33 }34 35 return 0;36 }