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 }