標籤:
遞推,f[i = i個名次][j = 共有j個人] = 方案數。
對於新加入的第j個人,如果並列之前的某個名次,那麼i不變,有i個可供並列的名次選擇,這部分是f[i][j-1]*i,
如果增加了一個名次,那麼之前有i-1個名次,i-1個名次之間有i個空,這部分是f[i-1][j-1]*i。
/********************************************************** --------------Tyrannosaurus--------- ** author AbyssalFish ***********************************************************/#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 10056;const int maxn = 1001;int f[maxn][maxn];//i個名次 j個人int ans[maxn];/*思路二 看成多次選第一名有多少個人*///#define LOCALint main(){#ifdef LOCAL freopen("in.txt","r",stdin);#endif //cout<<mod*mod<<endl; int T, n, kas = 0; scanf("%d",&T); f[0][0] = 1; for(int i = 1; i < maxn; i++){ for(int j = i; j < maxn; j++){ f[i][j] = (f[i-1][j-1]+f[i][j-1])*i; if(f[i][j] >= mod) f[i][j] %= mod; } } for(int j = 1; j < maxn; j++){ for(int i = 1; i <= j; i++){ //i <= j ans[j] += f[i][j]; } if(ans[j] >= mod) ans[j] %= mod; } while(T--){ scanf("%d",&n); printf("Case %d: %d\n", ++kas, ans[n]); } return 0;}
UVA 12034 Race