比赛 20110723 评测结果 WWWWWWWWWW
题目名称 排列 最终得分 0
用户昵称 PurpleShadow 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-23 12:26:17
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. const int N=101,MOD=2007;
  4. int n,k;
  5. bool flag[N][N];
  6. int dp[N][N],C[N][N];
  7. void prepare()
  8. {
  9. int i,j;
  10. for (i=0;i<N;++i)
  11. C[i][0]=C[0][i]=1;
  12. C[0][0]=0;
  13. for (i=1;i<N;++i)
  14. for (j=1;j<=i;++j)
  15. C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
  16. }
  17. int zero=0,one=1;
  18. const int& answer(int n,int k)
  19. {
  20. if (flag[n][k]) return dp[n][k];
  21. if (k==0||k==n-1) return zero;
  22. if (k>n-1||k<0) return one;
  23. int i,k1,k2;
  24. for (i=1;i<=n;++i)
  25. for (k1=0;k1<=k;++k1)
  26. {
  27. k2=k-k1-1;
  28. if (i==n) ++k2;
  29. dp[n][k]=(dp[n][k]+answer(i-1,k1)*answer(n-i,k2)*C[n-1][i-1])%MOD;
  30. }
  31. flag[n][k]=1;
  32. return dp[n][k];
  33. }
  34. int main()
  35. {
  36. freopen("permutation.in","r",stdin);
  37. freopen("permutation.out","w",stdout);
  38. memset(flag,0,sizeof(flag));
  39. memset(dp,0,sizeof(dp));
  40. prepare();
  41. while (scanf("%d%d",&n,&k)!=EOF)
  42. printf("%d\n",answer(n,k));
  43. return 0;
  44. }