https://www.51nod.com/Challenge/Problem.html#!#problemId=1670
参考http://www.cnblogs.com/whistle13326/p/7739636.html
dp[i]表示第i轮存活下来的希望 可以找到上述博客中 dp[i+1]=dp[i] *(x-(i+1)+1)/(n-(i+1)+1) 这个递推关系 对每一轮可求出至少活到当前轮的概率 那dp[i]-dp[i+1]就代表战胜第i个怪兽 败给第(i+1)个怪兽的概率 乘上系数即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=1e5+10;
ll sum[maxn],pre[maxn],dp[maxn];
int n;
void init()
{
ll i;
pre[0]=1;
for(i=1;i<=1e5;i++) pre[i]=(i*pre[i-1])%mod;
}
ll quickpow(ll a,ll b)
{
ll res;
res=1;
while(b>0){
if(b%2) res=(res*a)%mod;
a=(a*a)%mod,b/=2;
}
return res;
}
int main()
{
ll ans,i;
int tmp;
init();
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&tmp);
sum[tmp]++;
}
for(i=1;i<=n-1;i++) sum[i]+=sum[i-1];
dp[0]=pre[n];
for(i=1;i<=n;i++){
dp[i]=((dp[i-1]*(sum[i-1]-(i-1))%mod)*quickpow(n-(i-1),mod-2))%mod;
}
ans=0;
for(i=2;i<=n;i++){
ans=(ans+((dp[i-1]-dp[i]+mod)%mod)*(i-1))%mod;
}
ans=(ans+dp[n]*(ll)(n)%mod)%mod;
printf("%lld\n",ans);
return 0;
}