/*
translation:
求n个人赛马最终名次的可能性个数除以10056的余数
solution:
递推
假设第一名有i人,既有c[n][i]种可能,接下来有f(n-i)种
故答案sum(c[n][i]*f[n-i])%10056
note:
1:求组合数c[n][m]的递推方法
2:求类似递推的题目时候,考虑分类一般是以考虑“最左”为根据来分类
date: 2016.10.6
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1005;
const int M = 10056;
typedef long long ll;
ll f[maxn], c[maxn][maxn];
int n;
void C() {
for(int i = 0; i <= 1000; i++) {
c[i][i] = c[i][0] = 1;
for(int j = 1; j < i; j++) {
c[i][j] = (c[i-1][j] + c[i-1][j-1]) % M;
}
}
}
void printTable() {
f[0] = f[1] = 1; f[2] = 3;
C();
for(int i = 3; i <= 1000; i++) {
ll res = 0;
for(int j = 1; j <= i; j++) res = (res + c[i][j]*f[i-j]) % M;
f[i] = res;
}
}
int main()
{
printTable();
int T, kase = 0; cin >> T;
while(T--) {
cin >> n;
printf("Case %d: %lld\n", ++kase, f[n]);
}
return 0;
}
uva12034(递推关系)
最新推荐文章于 2020-11-06 21:04:54 发布