【CF1349D】Slime and Biscuits【概率期望】【解方程】
題意:nnn個人共有mmm個餅干,每輪隨機選一個餅干隨機給一個另外的人,所有餅干都在一個人手里時游戲結束,求期望進行次數。模998244353998244353998244353。
n≤105,m≤3×105n\leq10^5,m\leq3\times10^5n≤105,m≤3×105
首先肯定是每個人作為最終獲得所有餅干的人分別考慮。
但是如果只考慮這個人的話,無法確定游戲進行過程中是否已經在其他人那里結束了。
所以干脆改下規則:設當前考慮的人為xxx,規定只有xxx收集完所有餅干后游戲才結束。也就是有人收集完了所有餅干后,如果他不是xxx,游戲繼續進行;否則游戲立即結束。
為了后面講清楚,這里給一個不正式的嚴謹定義:設R,R1~RnR,R_1\sim R_nR,R1?~Rn?表示游戲遵循的規則,其中RRR表示任何一個人收集了所有餅干后游戲結束,即原來的規則。Rx(x∈[1,n])R_x(x\in[1,n])Rx?(x∈[1,n])表示只有xxx收集完游戲才結束的新規則。
設在RxR_xRx?下游戲期望進行的次數為Ex′E_x'Ex′?。即:設f′(x,i)f'(x,i)f′(x,i)表示游戲進行了iii步后結束且xxx獲得了所有餅干的概率,Ex′=∑i=0∞i?f′(x,i)E'_x=\sum_{i=0}^{\infin}i\cdot f'(x,i)Ex′?=∑i=0∞?i?f′(x,i)
注:這個f′(x,i)f'(x,i)f′(x,i)和后面的f(x,i)f(x,i)f(x,i)只是為了方便理解定義,對推導沒有影響。
我們考慮尋找新的規則和原來的規則的聯系
在RRR下,設PxP_xPx?表示游戲結束時所有餅干在xxx手上的概率,ExE_xEx?表示所有餅干在xxx手上結束的所有情況 的 概率乘以時間 之和。(注意不是期望,概率的分母包括了在其他人那里結束的情況)
即:設f(x,i)f(x,i)f(x,i)表示游戲進行iii步后結束,xxx獲得所有餅干的概率,Ex=∑i=0∞i?f(x,i),Px=∑i=0∞f(x,i)E_x=\sum_{i=0}^{\infin}i\cdot f(x,i),P_x=\sum_{i=0}^\infin f(x,i)Ex?=∑i=0∞?i?f(x,i),Px?=∑i=0∞?f(x,i)
有∑i=1nPi=1,∑i=1nEi=ans\sum_{i=1}^n P_i=1,\sum_{i=1}^nE_i=ans∑i=1n?Pi?=1,∑i=1n?Ei?=ans,ansansans為題目所求
設CCC表示在RjR_jRj?下,現在所有餅干在iii手上且i≠ji\neq ji?=j,游戲期望還要進行多少步。顯然這是個與i,ji,ji,j無關的常數。
考慮用ExE_xEx?表示出Ex′E_x'Ex′?
為了方便,我們稱一個狀態為iii類關鍵點,當且僅當這個狀態的所有餅干都在iii手上。
考慮在RxR_xRx?下的一場游戲,如果它只有結束狀態這一個關鍵點,期望步數為ExE_xEx?
否則我們枚舉第一個關鍵點的類別iii,顯然i≠xi\neq xi?=x,不然游戲會提前結束。然后從這個關鍵點開始就是 從“所有點都在iii手上”這個狀態開始的RxR_xRx?游戲,期望步數為CCC
所以:
Ex′=Ex+∑i=1n[i≠x](Ei+PiC)E'_x=E_x+\sum_{i=1}^n[i\neq x](E_i+P_iC)Ex′?=Ex?+i=1∑n?[i?=x](Ei?+Pi?C)
如果你想不通為什么CCC要乘上PiP_iPi?:
前面說過,Ex=∑i=0∞if(x,i)E_x=\sum_{i=0}^\infin if(x,i)Ex?=∑i=0∞?if(x,i)
換句話說,對于每一個iii,都有f(x,i)f(x,i)f(x,i)的可能性在iii步后 所有餅干都在xxx手上,在這里就是到達枚舉的第一個關鍵點。
在這之后還需要CCC步來到最終結束的狀態,即∑i=0∞(i+C)f(x,i)\sum_{i=0}^\infin(i+C)f(x,i)∑i=0∞?(i+C)f(x,i)
而Px=∑i=0∞f(x,i)P_x=\sum_{i=0}^{\infin}f(x,i)Px?=∑i=0∞?f(x,i),所以加上PiCP_iCPi?C就可以了
拆一下:
Ex′=Ex+∑i=1n[i≠x](Ei+PiC)E'_x=E_x+\sum_{i=1}^n[i\neq x](E_i+P_iC)Ex′?=Ex?+i=1∑n?[i?=x](Ei?+Pi?C)
Ex′=Ex+∑i=1n[i≠x]Ei+∑i=1n[i≠x]PiCE'_x=E_x+\sum_{i=1}^n[i\neq x]E_i+\sum_{i=1}^n[i\neq x]P_iCEx′?=Ex?+i=1∑n?[i?=x]Ei?+i=1∑n?[i?=x]Pi?C
Ex′=∑i=1nEx+C∑i=1n[i≠x]PiE'_x=\sum_{i=1}^nE_x+C\sum_{i=1}^n[i\neq x]P_iEx′?=i=1∑n?Ex?+Ci=1∑n?[i?=x]Pi?
Ex′=ans+C(1?px)E'_x=ans+C(1-p_x)Ex′?=ans+C(1?px?)
對x=1~nx=1\sim nx=1~n求和
∑i=1nEi′=n?ans+C(n?1)\sum_{i=1}^nE'_i=n\cdot ans+C(n-1)i=1∑n?Ei′?=n?ans+C(n?1)
只要求出Ex′E'_xEx′?和CCC的值,問題就解決了!
而CCC是嚴格包含于Ex′E_x'Ex′?的,所以我們的目標是解決新規則下的問題。
注意到在RxR_xRx?下,我們并不關心每個餅干具體在誰手上,我們只關心它在不在xxx手上
所以可以設f(i)f(i)f(i)表示當前xxx手上有iii個餅干時期望進行次數。
f(i)={1+1n?1f(i+1)+n?2n?1f(i)x=01+imf(i?1)+m?im(1n?1f(i+1)+n?2n?1f(i))0<x<m0x=mf(i)= \begin{cases} 1+\frac{1}{n-1}f(i+1)+\frac{n-2}{n-1}f(i)& x=0\\ 1+\frac{i}mf(i-1)+\frac{m-i}{m}(\frac{1}{n-1}f(i+1)+\frac{n-2}{n-1}f(i))& 0<x<m\\ 0 & x=m \end{cases}f(i)=??????1+n?11?f(i+1)+n?1n?2?f(i)1+mi?f(i?1)+mm?i?(n?11?f(i+1)+n?1n?2?f(i))0?x=00<x<mx=m?
解出這個方程就好了
暴力硬推是一種方法,這里有一個很優美的思路:
考慮中間的式子,記為
f(i)=Af(i?1)+Bf(i)+Cf(i+1)+1f(i)=Af(i-1)+Bf(i)+Cf(i+1)+1f(i)=Af(i?1)+Bf(i)+Cf(i+1)+1
Af(i?1)+(B?1)f(i)+Cf(i+1)+1=0Af(i-1)+(B-1)f(i)+Cf(i+1)+1=0Af(i?1)+(B?1)f(i)+Cf(i+1)+1=0
注意到A+B+C=1A+B+C=1A+B+C=1,設g(i)=f(i)?f(i+1)g(i)=f(i)-f(i+1)g(i)=f(i)?f(i+1)
A?g(i?1)+(A+B?1)g(i)+1=0A\cdot g(i-1)+(A+B-1)g(i)+1=0A?g(i?1)+(A+B?1)g(i)+1=0
g(i)=A?g(i?1)+1Cg(i)=\frac{A\cdot g(i-1)+1}{C}g(i)=CA?g(i?1)+1?
這樣推一次就可以把ggg算出來,求個后綴和就得到了fff
然后Ex′=f(ai),C=f(0)E_x'=f(a_i),C=f(0)Ex′?=f(ai?),C=f(0)
復雜度O(n)O(n)O(n)
#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #define MAXN 300005 using namespace std; inline int read() {int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans; } const int MOD=998244353; typedef long long ll; inline int qpow(int a,int p) {int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD;p>>=1;}return ans; } #define inv(x) qpow(x,MOD-2) inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;} inline int dec(const int& x,const int& y){return x<y? x-y+MOD: x-y;} int a[MAXN],f[MAXN]; int main() {int n=read(),m=0;for (int i=1;i<=n;i++) m+=(a[i]=read());f[0]=n-1;for (int i=1;i<m;i++) f[i]=((ll)i*inv(m)%MOD*f[i-1]%MOD+1)*m%MOD*(n-1)%MOD*inv(m-i)%MOD;for (int i=m;i>=0;i--) f[i]=add(f[i],f[i+1]);int sum=0;for (int i=1;i<=n;i++) sum=add(sum,f[a[i]]);sum=dec(sum,f[0]*(n-1ll)%MOD);sum=(ll)sum*inv(n)%MOD;cout<<sum;return 0; }總結
以上是生活随笔為你收集整理的【CF1349D】Slime and Biscuits【概率期望】【解方程】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二联律是什么
- 下一篇: 【CF1344D】Résumé Revi