题意:对于任意一种n的排列,定义它的E 值为ai>i的个数,问在n的排列里有几个这样的排列
思路:DP递推
对于新加入的一个数i+1 1.加到尾部,值不变 2.把它和一个满足ai>i的数交换,值不变 3。拿一个不满足ai>i的数与它交换,值+1
===>dp[i][j]=dp[i-1][j]+dp[i-1][j]*j+dp[i-1][j-1]*(i-j);
代码:
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
const int M=1005;
long long Mod=1000000007;
long long dp[M][M];
void init()
{
for(int i=1;i<=M;i++)
{
dp[i][0]=1;
for(int j=1;j<=i;j++)
{
dp[i][j]=(dp[i-1][j]+dp[i-1][j]*j+dp[i-1][j-1]*(i-j))%Mod;
//dp[i][j]%=Mod;
}
}
}
int main()
{
init();
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
printf("%I64d\n",dp[n][k]);
}
return 0;
}