【题目描述】
将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2012取模。
【输入描述】
第一行2个整数n,k。
【输出描述】
一个整数表示答案。
【样例输入】
5 2
【样例输出】
66
【数据范围及提示】
对于30%的数据:n <= 10;
对于100%的数据:k < n <= 1000。
源代码: #include<cstdio> const int q=2012; int n,k,f[1001][1001]={0}; int main() { scanf("%d%d",&n,&k); for (int a=1;a<=n;a++) f[a][0]=1; //边界好坑爹!!! for (int a=2;a<=n;a++) for (int b=1;b<=k&&b<a;b++) //状态转移方程挺容易的,不过一定要注意思考全面。 f[a][b]=((f[a-1][b]*(b+1))%q+(f[a-1][b-1]*(a-b))%q)%q; printf("%d",f[n][k]); return 0; }