题目大意
一个班有n (2<=n<=1e5) 人,其中有m ( 0<=m<=min(1e5,n*(n-1)/2 ) 对好朋友,第i对朋友的友谊值为 f [ i ] (1<=f [ i ]<=1e9 )。组织 k (1<=k<=2e5)次远足,每次选2人,若选中的是一对好朋友则远足结束之后友谊值加1,若不是好朋友友谊值依旧为0。问:k次远足结束之后,总的友谊值的期望是多少。
思路
首先,每一对选中的概率为p= 。假设有3人,则有3中可能,且其中有一对好朋友并且友谊值为f,则初始时的友谊值期望为 p*0+p*0+p*f= p *。而友谊值增加的期望即等于选中一对好朋友的概率(因为选中友谊值就增加)即p*m。
code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7;
signed qsm(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = ((res % mod) * (a % mod)) % mod;
a = ((a % mod) * (a % mod)) % mod;
b >>= 1;
}
return res;
}
void solve() {
int sum = 0, ans = 0;
int n, m, k;
cin >> n >> m >> k;
int tmp = ((n % mod) * ((n - 1) % mod)) % mod;
int p = 2 * qsm(tmp, mod - 2) % mod;
for (int i = 0; i < m; ++i) {
int a, b, f;
cin >> a >> b >> f;
sum = (sum % mod + f % mod) % mod;
}
while (k--) {
ans = (ans + sum * p % mod) % mod;
sum = (sum % mod + p * m % mod) % mod;
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}