挺好想的递推,不过发现了一个小问题,就是组合数如果用乘除那种递推法的话会出错,因为如果取余后结果恰好为0那么以后的组合数就都是0了。。。所以最好用加法的那种递推

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
const int mod = 10056;
int T, n;
long long dp[maxn], C[maxn][maxn];
int main() {
//freopen("out.txt", "w", stdout);
for (int i = 1; i <= 1000; i++) C[i][0] = C[i][i] = 1;
for (int i = 2; i <= 1000; i++) {
for (int j = 1; j < i; j++) {
C[i][j] = (C[i-1][j]+C[i-1][j-1]) % mod;
}
}
for (int i = 1; i <= 1000; i++) dp[i] = 1;
for (int i = 2; i <= 1000; i++) {
for (int j = 1; j < i; j++) {
dp[i] = (dp[i] + C[i][j]*dp[i-j])%mod;
}
}
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d", &n);
printf("Case %d: %lld\n", kase, dp[n]);
}
return 0;
}