记录编号 26300 评测结果 AAAAAAAAAA
题目名称 排列 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 2.740 s
提交时间 2011-07-23 15:59:25 内存使用 0.27 MiB
显示代码纯文本
#include <cstdio>

const int MAXN=105;
const int MO=2007;

inline void Add(int &a,int b)
{
	a=(a+b)%MO;
}

int N,K;
int d[MAXN][MAXN],C[MAXN][MAXN];
int main()
{
	freopen("permutation.in","r",stdin);
	freopen("permutation.out","w",stdout);
	C[0][0]=1;
	for(int i=1;i<MAXN;i++)
	{
		C[i][0]=1;
		for(int j=1;j<=i;j++)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%MO;
	}
	d[1][0]=1;
	for(int i=2;i<MAXN;i++)
		for(int j=0;j<i;j++)
		{
			int &nd=d[i][j];
			nd=(nd+d[i-1][j])%MO; //N > ...
			if (j!=0)
				nd=(nd+d[i-1][j-1])%MO; // ...< N
			for(int p=1;p<i-1;p++)
				for(int k=0;k<j;k++)
					nd=(nd+C[i-1][p]*d[p][k]%MO*d[i-1-p][j-1-k])%MO;  // .. < N > ..
		}
	while(scanf("%d%d",&N,&K)!=EOF)
		printf("%d\n",d[N][K]);	
	return 0;
}