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的最开始就直接构造,这样才不会超时,放在里面会超时。
代码实现:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
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 }