CF1925D Good Trip

XCPC發表於2024-05-09

題意:

一個班有 \(n\) 個孩子,其中有 \(m\) 對朋友,第 \(i\) 對朋友的友誼值為 \(f_i\)

老師要進行 \(k\) 次遠足,每次遠足她都會等機率地選擇一對孩子。如果選擇了一對是朋友的孩子,他們的友誼值在以後的遠足中都會增加 \(1\) (老師可以多次選擇一對孩子)。如果一對兒童不是朋友,那麼他們的友誼值為 \(0\),在以後的遠足中不會改變。

求所有被選中參加遠足的 \(k\) 對的友誼值總和的期望值(在被選中時)。

思路:

由於本題期望具有可加性,因此我們可以獨立考慮初始友誼值的貢獻和透過重複遊覽增加友誼值的貢獻

假設被選中了 \(i\) 次考慮把答案拆成兩部分:初值貢獻 \(i\cdot f\) 和 增量帶來的貢獻 \(\dfrac{i\cdot(i-1)}{2}\) , 每次抽中一對朋友的機率 \(P_1 = \dfrac{1}{C_n^2}\) ,抽不到的機率 \(P_2 = 1 - P_1\)

初始友誼值的貢獻將為 $ ans =\dfrac{k\cdot \sum_{i=1}{n}f_i}{C_n2}$

現在,為了計算由於遠足而增加的友誼值對答案的貢獻,對於每對朋友,它將是 \(\sum_{x=0}^{k}\dfrac{x(x-1)}{2}\cdot P(x)\)

因為此機率滿足二項分佈,其中 \(P(x)\) 是一對朋友被恰好選擇了 \(x\) 次,由二項分佈機率公式可知 \(P(x)={C_k^x}\cdot \bigg(P_1\bigg)^{x}\cdot \bigg(P_2\bigg)^{k-x}\) ,因為 \(\sum_{k}\) 較小,直接列舉計算。

因為所有好友的增加都是統一的,所以我們需將該增量總值乘以 \(m\) 並將其新增到答案中

程式碼

void Solve(){
	cin>>n>>m>>k;
	int sumf=0;
	rep(i,1,m){
		cin>>x>>y>>f;
		sumf=(sumf+f)%mod;
	}
	int p1=Inv(C(n,2),mod),p2=(C(n,2)-1)*p1%mod;
	int fm=Inv(ksmm(C(n,2),k,mod),mod);
	ans=k*sumf%mod*p1%mod;
	int res=0;
	rep(i,1,k){
		int g=i*(i-1)%mod*Inv(2,mod)%mod;
		res=(res+C(k,i)*ksmm(p1,i,mod)%mod*ksmm(p2,k-i,mod)%mod*g%mod)%mod;
	}
	res=res*m%mod;
	cout<<(ans+res)%mod<<endl;
}

相關文章