比赛 |
20110723 |
评测结果 |
WWWWWWWWWW |
题目名称 |
排列 |
最终得分 |
0 |
用户昵称 |
PurpleShadow |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-07-23 12:26:17 |
显示代码纯文本
- #include <cstdio>
- #include <cstring>
- const int N=101,MOD=2007;
- int n,k;
- bool flag[N][N];
- int dp[N][N],C[N][N];
- void prepare()
- {
- int i,j;
- for (i=0;i<N;++i)
- C[i][0]=C[0][i]=1;
- C[0][0]=0;
- for (i=1;i<N;++i)
- for (j=1;j<=i;++j)
- C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
- }
- int zero=0,one=1;
- const int& answer(int n,int k)
- {
- if (flag[n][k]) return dp[n][k];
- if (k==0||k==n-1) return zero;
- if (k>n-1||k<0) return one;
- int i,k1,k2;
- for (i=1;i<=n;++i)
- for (k1=0;k1<=k;++k1)
- {
- k2=k-k1-1;
- if (i==n) ++k2;
- dp[n][k]=(dp[n][k]+answer(i-1,k1)*answer(n-i,k2)*C[n-1][i-1])%MOD;
- }
- flag[n][k]=1;
- return dp[n][k];
- }
- int main()
- {
- freopen("permutation.in","r",stdin);
- freopen("permutation.out","w",stdout);
- memset(flag,0,sizeof(flag));
- memset(dp,0,sizeof(dp));
- prepare();
- while (scanf("%d%d",&n,&k)!=EOF)
- printf("%d\n",answer(n,k));
- return 0;
- }