题意:
有n个人赛马,名次可能并列,求一共有多少种可能。
分析:
设所求为f(n),假设并列第一名有i个人,则共有C(n, i)种可能,接下来确定后面的名次,共有f(n-1)种可能
所以递推关系为:
#include <cstdio> const int maxn = ;
int C[maxn+][maxn+], f[maxn+];
const int M = ; void Init()
{
//递推组合数
for(int i = ; i <= maxn; ++i)
{
C[i][] = C[i][i] = ;
for(int j = ; j < i; ++j)
C[i][j] = (C[i-][j-] + C[i-][j]) % M;
}
//递推f
f[] = ;
for(int i = ; i <= maxn; ++i)
for(int j = ; j <= i; ++j)
f[i] = (f[i] + C[i][j] * f[i-j]) % M;
} int main()
{
Init();
int T;
scanf("%d", &T);
for(int kase = ; kase <= T; ++kase)
{
int n;
scanf("%d", &n);
printf("Case %d: %d\n" ,kase, f[n]);
} return ;
}
代码君