I - 双人登山 - Solution
期望的贡献可以分为两部分,第一部分是原始数组产生的贡献,第二部分是增加的数产生的贡献,注意到第二部分和原数组没有任何关系,只与增加的方案相关。
第一部分的贡献即 ,其中
令第二部分贡献的随机变量为 ,每个友谊组合的贡献的随机变量为同分布
,则
,这步是问题核心。
令每个友谊组合被选中的次数为 ,因为选中
次就会产生
的贡献,有
,又
,因此
,其中
最终
int n,m,k;
int a[100005],b[100005],f[100005];
const ll mod=1e9+7;
inline ll qpow(ll x,ll n){ll res=1;for(;n;(n&1)&&(res=res*x%mod),x=x*x%mod,n>>=1);return res;}
ll jc[200005],jcinv[200005],dpx[200005],mdpx[200005];
const int MAXK=2e5;
inline ll C(ll n,ll m){return jc[n]*jcinv[m]%mod*jcinv[n-m]%mod;}
int main(){
jc[0]=jc[1]=1;
for(int i=2;i<=MAXK;i++)
jc[i]=jc[i-1]*i%mod;
jcinv[MAXK]=qpow(jc[MAXK],mod-2);
for(int i=MAXK-1;i>=0;i--)
jcinv[i]=jcinv[i+1]*(i+1)%mod;
int t;
R(t);
while(t--){
R(n);R(m);R(k);
ll ans1=0,ans2=0;
for(int i=1;i<=m;i++){
R(a[i]);R(b[i]);R(f[i]);
ans1=(ans1+f[i])%mod;
}
ll d=1ll*n*(n-1)/2%mod;
ans1=qpow(d,mod-2)*ans1%mod*k%mod;
dpx[0]=mdpx[0]=1;
dpx[1]=qpow(d,mod-2);
mdpx[1]=(d-1)*qpow(d,mod-2)%mod;
for(int i=2;i<=k;i++){
dpx[i]=dpx[i-1]*dpx[1]%mod;
mdpx[i]=mdpx[i-1]*mdpx[1]%mod;
}
ll cnt;
for(int x=1;x<=k;x++){
cnt=1ll*x*(x-1)/2%mod;
ans2=(ans2+cnt*C(k,x)%mod*dpx[x]%mod*mdpx[k-x]%mod)%mod;
}
printf("%lld\n",(ans1+ans2*m%mod)%mod);
}return 0;
}