2021CCPC河南省赛 B:使用技能(期望,组合数学)

我们可以发现决定每个技能造成最终伤害的是由这个技能出现的次数决定的,跟技能的种类还有位置这些都没有关系。所以我们可以考虑枚举技能出现的次数
期望的分母很好考虑,就是mn,下面考虑分子部分。
先考虑只有一个技能时,我们对于一个技能枚举其使用了i次,那么就相当于从n个技能槽中选i个技能槽放这个技能,即C(n,i)。然后还剩下n-i个技能槽,每个技能槽都可能放其余的m-i个技能,即(m-1)n-1种可能。由题意这个技能的伤害为i2,则对于这一个技能其所造成伤害的总量即为C(n,i)*(m-1)n-1*i2,又因为对这些技能是等概率出现的,所以对于每一个技能造成的伤害总量都是一样的,所以前面再乘一个m就是所有技能释放次数为x下的伤害总量。那么我们只要枚举一下这个技能出现的次数,整个分子就可以得到了。
具体看AC代码:

#include <bits/stdc++.h>
#define int long long
using namespace std; 
const int N=1e5+5,mod=1e9+7;
int n,m;
int fact[N],infact[N];

int qmi(int a,int k){
    int res=1;
    while(k){
        if(k&1)res=res*a%mod;
        a=a*a%mod;
        k>>=1;
    }
    return res;
}

int inv(int x){
	return qmi(x,mod-2)%mod;
}

void init(){
	fact[0]=infact[0]=1;
    for(int i=1;i<N;i++){
        fact[i]=fact[i-1]*i%mod;
        infact[i]=infact[i-1]*qmi(i,mod-2)%mod;
    }
}

int C(int a,int b){
    return fact[a]%mod*infact[a-b]%mod*infact[b]%mod;
}

void solve(){
	cin>>n>>m;
	
	int res=0;
	for(int i=1;i<=n;i++)res=(res+m*C(n,i)%mod*qmi(m-1,n-i)%mod*i%mod*i%mod)%mod;
	
	res=res*inv(qmi(m,n))%mod;
	
	cout<<res<<endl;	
}

main(){
	init();
	int T;
	cin>>T;
	while(T--)solve();
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值