Permutation Counting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1739 Accepted Submission(s): 918 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 Sample Output 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} Source 2010 Asia Regional Harbin Recommend |
题意 :E条件:就是在下标为i处的数值ai大于i (i从1开始) 给出数串的长度N 与k 问在当下数串长度下1,2,3。。。N 的数串排列中 有多少个排列符合E条件
dp 。。。 d[i][j]=d[i-1][j]+d[i-1][j]*j+d[i-1][j-1]*(i-j); 即 在i长度下每个排列的E条件数为j的排列数 = 当在i-1长度下 有j个E条件的排列数 + 在i-1长度下有j个E条件数的排列数 * (新数来了后与符合条件的数交换 仍然符合E条件)+ 在i-1长度下 有j-1个符合E条件的数的排列数 * (i-j)【即把 每个有j-1个符合的排列中不符合E条件的数与新来的第i个数交换 符合条件的数会++】 也就是说 把直接放后面的 还有与符合条件数交换的 还有不符合条件的数交换的所有情况都考虑在内
code。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1000000007;
ll d[1010][1010];
int main()
{
d[1][0]=1;
for(int i=1;i<=1000;i++)d[1][i]=0;
for(int i=2;i<=1000;i++)
{
for(int j=0;j<=i;j++)
{
d[i][j]=d[i-1][j]+d[i-1][j]*j+d[i-1][j-1]*(i-j);
d[i][j]%=MOD;
}
}
int n,k;
while(cin>>n>>k)
{
cout<<d[n][k]<<endl;
}
return 0;
}
注意结果取模 并且dp数组要开ll