hdu 3664
来源:互联网 发布:csmhuan实时数据 编辑:程序博客网 时间:2024/06/05 14:07
Permutation Counting
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 912 Accepted Submission(s): 456
Problem Description
Given a permutation a1, a2, … aN of {1, 2, …, N}, we define its E-value as the amount of elements where ai > i. For example, the E-value of permutation {1, 3, 2, 4} is 1, while the E-value of {4, 3, 2, 1} is 2. You are requested to find how many permutations of {1, 2, …, N} whose E-value is exactly k.
Input
There are several test cases, and one line for each case, which contains two integers, N and k. (1 <= N <= 1000, 0 <= k <= N).
Output
Output one line for each case. For the answer may be quite huge, you need to output the answer module 1,000,000,007.
Sample Input
3 0 3 1
Sample Output
1 4
Hint
There is only one permutation with E-value 0: {1,2,3}, and there are four permutations with E-value 1: {1,3,2}, {2,1,3}, {3,1,2}, {3,2,1}思路:
DP啊DP
a[i][j]表示1~i个数字中有J个大于其位置符的排列总数。
a[i][j]=(j+1)*a[i-1][j]+(i-j)*a[i-1][j-1];
这里要注意的是,得到a的循环不能直接根据题目的输入得到,而是要在main的最开始就直接构造,这样才不会超时,放在里面会超时。
代码实现:
View Code
1 #include<iostream> 2 using namespace std; 3 long long a[1005][1005]; 4 int main(){ 5 int n,m; 6 a[0][0]=1; 7 for(int k=1;k<=1000;k++){ 8 for(int g=0;g<=k;g++){ 9 a[k][g]=((g+1)*a[k-1][g])%1000000007;10 if(g>0){11 a[k][g]=(a[k][g]+((k-g)*a[k-1][g-1])%1000000007)%1000000007;12 }13 }14 }15 while(cin>>n>>m){16 cout<<a[n][m]<<endl;17 }18 return 0;19 }
- hdu 3664
- hdu 3664
- hdu 3664
- 【DP】hdu 3664
- hdu 3664 递推
- HDU 3664 DP
- HDU 3664 Permutation Counting
- hdu 3664 dp
- HDU 3664(DP)
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- CLR笔记目录
- poj 1860 最短路径变形
- BFS进阶 poj 1184
- ThreadPoolExecutor源码解析
- poj 1166 简单搜索
- hdu 3664
- usaco 1.1 greedy gift givers
- poj 1002 stl map
- Contest on codeforce A
- JAVA面试试题集,很不错哦
- codeforce 11 04 A
- 最大流模板 Ford-Fulkerson and Dinic
- usaco 1.1 Broken Necklace
- usaco 1.1 Miking Cows