51nod 1670 打怪兽

来源:互联网 发布:金十数据官网财经报告 编辑:程序博客网 时间:2024/05/17 00:15

设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);} }


0 0