定义 d p [ i ] dp[i] dp[i]为能量为 i i i时可行的方案数

那么显然 d p [ 0 ] = n ! dp[0]=n! dp[0]=n!

d p [ i ] = ( a [ i − 1 ] − i + 1 ) / ( n − i + 1 ) dp[i]=(a[i-1]-i+1)/(n-i+1) dp[i]=(a[i1]i+1)/(ni+1)

其中 i − 1 i-1 i1是已经杀死的敌人个数

a [ i − 1 ] a[i-1] a[i1]表示怪物的前缀和,也就是能杀死的怪物总数

 #include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int maxn=2e5+10;
int n,m,dp[maxn],a[maxn];
int quick_pow(int x,int n)
{
	int ans=1;
	while( n )
	{
		if( n&1 )	ans=ans*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return ans;
}
int inv(int x){
	return quick_pow(x,mod-2);
}
signed main()
{
	cin >> n ;
	for(int i=1;i<=n;i++)
	{
		int x; cin >> x;
		a[x]++;
	}
	int fac=1;
	for(int i=1;i<=n;i++)	fac*=i,fac%=mod;
	for(int i=1;i<=n;i++)	a[i]+=a[i-1];
	dp[0]=fac;
	for(int i=1;i<=n;i++)
		dp[i]=dp[i-1]*(a[i-1]-i+1)%mod*inv(n-i+1)%mod;
	//有a[i-1]-(i-1)个怪物可以打
	int ans=0;
	for(int i=0;i<=n;i++)
	{
		ans+=i*(dp[i]-dp[i+1] );
		ans%=mod;
	} 
	cout << ans;
}