我们可以发现决定每个技能造成最终伤害的是由这个技能出现的次数决定的,跟技能的种类还有位置这些都没有关系。所以我们可以考虑枚举技能出现的次数。
期望的分母很好考虑,就是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();
}```