BZOJ2554 Color 和 CF1349D Slime and Biscuits


Color

\(n\)個球排成一列,每個球都有一個顏色,用A~Z的大寫字母來表示。我們每次隨機選出兩個球ball1,ball2,使得后者染上前者的顏色。求期望操作多少次,才能使得所有球的顏色都一樣?

對於100%的數據,\(n \leq 10000\)

題解

首先確定如何算答案。

\[\text{ans}=\sum_{c=\textsf{'A'}}^{\textsf{'Z'}}E(\text{cnt}_c)P(\text{cnt}_c) \]

我們對每種顏色分開考慮,假設我們正在考慮顏色\(c\)。那么我們要求的是以這種顏色作為結束狀態時的期望步數乘上以這種顏色作為結束狀態時概率。

在我們對\(c\)單獨考慮的時候,其他顏色是等價的,所以影響結果的只有\(c\)的個數。並且如果結束狀態最終不是\(c\)的時候,我們認為它對答案的貢獻是\(0\)。可以證明這樣計算是不重不漏的。

第一部分

定義\(P(i)\)表示當前顏色的球有\(i\)個時,以當前顏色作為結束狀態的概率。

顯然\(P(0)=0,P(n)=1\)

如果需要更嚴謹的表達,那么\(P\)的下標應該還要帶上\(n\)

考慮這一步選擇的球的情況,那么

\[P(i)=\frac{(i(i-1)+(n-i)(n-i-1))}{n(n-1)}P(i)+\frac{i(n-i)}{n(n-1)}P(i-1)+\frac{(n-i)i}{n(n-1)}P(i+1) \]

\[P(i)=\frac{P(i+1)+P(i-1)}{2} \]

那么\(P\)是一個等差數列。由\(P(0)=0,P(n)=1\)可得公差為\(\frac{1}{n}\),所以\(P(i)=\frac{i}{n}\)

第二部分

仍然考慮這一步選擇的球的情況

\[E(i)P(i)=\frac{(i(i-1)+(n-i)(n-i-1))}{n(n-1)}E(i)P(i)+\frac{(n-i)i}{n(n-1)}E(i+1)P(i+1)+\frac{i(n-i)}{n(n-1)}E(i-1)P(i-1)+P(i) \]

這里后面加的\(P(i)\)便是這題與其它題的差異的主要體現。因為我們只計算以當前顏色作為結束狀態時的貢獻,所以如果這一步的選擇不能到達,那么這一步便不計入貢獻。

\[E(i)P(i)=\frac{E(i+1)P(i+1)+E(i-1)P(i-1)}{2}+\frac{P(i)n(n-1)}{2i(n-i)}\\ =\frac{E(i+1)P(i+1)+E(i-1)P(i-1)}{2}+\frac{n-1}{2(n-i)} \]

為了方便,令\(F(i)=E(i)P(i)\),那么我們的目標就是要求出這個數組。

\[F(i)=\frac{F(i+1)+F(i-1)}{2}+\frac{n-1}{2(n-i)} \]

\[F(i+1)=2F(i)-F(i-1)-\frac{n-1}{n-i} \]

注意這個遞推式的形式。如果我們能夠求出\(F(1)\),那么整個數組就可以推出來了。關鍵是要利用好 \(F(0)=F(n)=0\)的性質。

考試的時候你就應該開始二分\(F(1)\)的值讓它滿足條件,然后找規律。

UPD:應該手動高斯消元……

如果你經驗豐富,那么就應該早已看出遞推式的另一種方便求和的形式了。

\[F(i+1)-F(i)=F(i)-F(i-1)-\frac{n-1}{n-i} \]

\(\Delta=F(1)-F(0)\),那么

\[F(i)=F(0)+i\Delta-(i-1)\frac{n-1}{n-1}-(i-2)\frac{n-1}{n-2}-\dots-(i-(i-1))\frac{n-1}{n-(i-1)}\\ =F(0)+i\Delta-(n-1)\left(i-1-\frac{n-i}{n-1}-\frac{n-i}{n-2}-\dots-\frac{n-i}{n-(i-1)}\right)\\ =F(0)+i\Delta-(n-1)\left(i-1-(n-i)\sum_{j=1}^{i-1}\frac{1}{n-j}\right) \]

帶入\(n\)可得

\[F(n)=F(0)+n\Delta-(n-1)(n-1) \]

\[\Delta=\frac{(n-1)^2}{n} \]

所以\(F(1)=\frac{(n-1)^2}{n}\),那么這個題就做完了。時間復雜度\(O(n)\)

CO int N=10000+10;
char str[N];
int cnt[26];
LD F[N];

int main(){
	scanf("%s",str+1);
	int n=strlen(str+1);
	for(int i=1;i<=n;++i) ++cnt[str[i]-'A'];
	F[0]=0,F[1]=(LD)(n-1)*(n-1)/n;
	for(int i=2;i<=n;++i) F[i]=2*F[i-1]-F[i-2]-(LD)(n-1)/(n-i+1);
	LD ans=0;
	for(int i=0;i<26;++i) ans+=F[cnt[i]];
	printf("%.1Lf\n",ans);
	return 0;
}

Slime and Biscuits

Slime and his \(n\) friends are at a party. Slime has designed a game for his friends to play.

At the beginning of the game, the \(i\)-th player has \(a_i\) biscuits. At each second, Slime will choose a biscuit randomly uniformly among all \(a_1 + a_2 + \ldots + a_n\) biscuits, and the owner of this biscuit will give it to a random uniform player among \(n-1\) players except himself. The game stops when one person will have all the biscuits.

As the host of the party, Slime wants to know the expected value of the time that the game will last, to hold the next activity on time.

For convenience, as the answer can be represented as a rational number \(\frac{p}{q}\) for coprime \(p\) and \(q\), you need to find the value of \((p \cdot q^{-1})\mod 998\,244\,353\). You can prove that \(q\mod 998\,244\,353 \neq 0\).

\(2\le n\le 100\,000,1\le a_1+a_2+\dots+a_n\le 300\,000\).

題解

類似BZOJ2554 Color,我們對每個人分開考慮,求每個人取滿餅干的期望時間與取滿餅干的概率的乘積的和。

\[\text{ans}=\sum_{i=1}^nE(a_i)P(a_i) \]

\(\sigma=\sum_{i=1}^n a_i\),那么有轉移

\[P(x)=\frac{x}{\sigma}P(x-1)+\frac{\sigma-x}{\sigma}(\frac{n-2}{n-1}P(x)+\frac{1}{n-1}P(x+1)) \]

\[E(x)P(x)=\frac{x}{\sigma}E(x-1)P(x-1)+\frac{\sigma-x}{\sigma}(\frac{n-2}{n-1}E(x)P(x)+\frac{1}{n-1}E(x+1)P(x+1))+P(x) \]

然后帶入\(P(0)=0,P(\sigma)=1,E(0)P(0)=0,E(\sigma)P(\sigma)=0\),你就會發現過不了樣例。

因為這題即使一個人餅干沒了,別人還是可以分給他餅干。所以\(P(0)\neq 0,E(0)P(0)\neq 0\)

https://codeforces.com/blog/entry/77284

\(E'(x)\)為一個人有\(x\)塊餅干時,取滿餅干的期望時間(其他人取滿不結束)。

\[\forall k\in [1,n],~\sum_{i=1}^nE(a_i)P(a_i)=E'(a_k)-E'(0)\sum_{i=1,i\neq k}^n P(a_i) \]

這個式子的意思是減去冗余的時間。

對於\(k\in [1,n]\),對這個等式的兩側分別求和得到

\[n\sum_{i=1}^nE(a_i)P(a_i)=\sum_{i=1}^nE'(a_i)-E'(0)(n-1)\sum_{i=1}^nP(a_i) \]

因為\(\text{ans}=\sum_{i=1}^nE(a_i)P(a_i),\sum_{i=1}^nP(a_i)=1\),所以

\[n\cdot \text{ans}=\sum_{i=1}^nE'(a_i)-E'(0)(n-1) \]

容易寫出\(E'\)的轉移

\[E'(x)=\frac{x}{\sigma}E'(x-1)+\frac{\sigma-x}{\sigma}(\frac{n-2}{n-1}E'(x)+\frac{1}{n-1}E'(x+1))+1 \]

帶入\(E'(\sigma)=0\)即可。時間復雜度\(O(n\log 998244353)\)

CO int N=3e5+10;
int a[N],E[N][4];

int main(){
	int n=read<int>(),s=0;
	for(int i=1;i<=n;++i) s+=read(a[i]);
	int is=fpow(s,mod-2),in=fpow(n-1,mod-2);
	for(int x=0;x<=s-1;++x){
		E[x][0]=mod-mul(x,is);
		E[x][1]=1+mod-mul(mul(s-x,is),mul(n-2,in));
		E[x][2]=mod-mul(mul(s-x,is),in);
		E[x][3]=1;
	}
	E[s-1][2]=0;
	for(int x=0;x<=s-2;++x){
		int c=mul(mod-E[x+1][0],fpow(E[x][1],mod-2));
		E[x+1][0]=add(E[x+1][0],mul(E[x][1],c));
		E[x+1][1]=add(E[x+1][1],mul(E[x][2],c));
		E[x+1][3]=add(E[x+1][3],mul(E[x][3],c));
	}
	E[s-1][3]=mul(E[s-1][3],fpow(E[s-1][1],mod-2)),E[s-1][1]=1;
	for(int x=s-2;x>=0;--x){
		E[x][3]=add(E[x][3],mul(E[x+1][3],mod-E[x][2])),E[x][2]=0;
		E[x][3]=mul(E[x][3],fpow(E[x][1],mod-2)),E[x][1]=1;
	}
	int ans=0;
	for(int i=1;i<=n;++i) ans=add(ans,E[a[i]][3]);
	ans=add(ans,mod-mul(E[0][3],n-1));
	ans=mul(ans,fpow(n,mod-2));
	printf("%d\n",ans);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM