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