记录编号 26285 评测结果 AAAAAAAAAA
题目名称 排列 最终得分 100
用户昵称 GravatarPurpleShadow 是否通过 通过
代码语言 C++ 运行时间 1.644 s
提交时间 2011-07-23 14:46:44 内存使用 0.35 MiB
显示代码纯文本
#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 one;
	if (k>n-1||k<0) return zero;
	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]+(long long)answer(i-1,k1)*answer(n-i,k2)*C[n-1][i-1]%MOD)%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;
}