设dp[i]表示能打败第i-1个怪兽的概率。
dp[i+1]=dp[i]*(sum[i]-i)/(n-i)
sum[i] 代表能量值不高于i的怪兽数量。
递推出所有的 dp[i] 后,对每种情况进行求解。
若最多能打败x个怪兽,
其概率为 dp[x]-dp[x+1] 。
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long dp[100100],sum[100100],fact[100100];
long long n;
long long powmod(long long x,long long p)
{
long long ret=1;
while(p)
{
if(p&1)
ret=ret*x%mod;
x=x*x%mod;
p>>=1;
}
return ret;
}
long long inv(long long x)
{
return powmod(x,mod-2);
}
int main()
{
long long n,i,ans,x;
fact[0]=1;
for(i=1;i<=100000;i++)
fact[i]=fact[i-1]*i%mod;
while(cin>>n)
{
memset(sum,0,sizeof(sum));
memset(dp,-1,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%lld",&x);
sum[x]++;
}
for(i=1;i<=n;i++)
sum[i]+=sum[i-1];
dp[0]=fact[n];
for(i=0;i<=n;i++)
{
dp[i+1]=dp[i]*(sum[i]-i)%mod*inv(n-i)%mod;
}
ans=0;
for(i=0;i<=n;i++)
{
ans=(ans+i*(dp[i]-dp[i+1]+mod)%mod)%mod;
}
printf("%lld\n",ans);
}
}