uva12034Race
递推,组合。
考虑第一名有i个人,则f[n]=sum(C(n,i)*f[n-i]),递推即可..
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int mod = 10056; const int maxn = 1000 + 10; int n=1000,T; int C[maxn][maxn]; int f[maxn]; void predo() { for(int i=1;i<=n;i++) { C[i][0]=C[i][i]=1; for(int j=1;j<i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; } } void init() { predo(); f[0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) f[i]=(f[i]+C[i][j]*f[i-j])%mod; } int main() { init(); scanf("%d",&T); for(int i=1;i<=T;i++) { scanf("%d",&n); printf("Case %d: %d\n",i,f[n]); } return 0; }