定义 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[i−1]−i+1)/(n−i+1)
其中 i − 1 i-1 i−1是已经杀死的敌人个数
a [ i − 1 ] a[i-1] a[i−1]表示怪物的前缀和,也就是能杀死的怪物总数
#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;
}