日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CF1349D】Slime and Biscuits【概率期望】【解方程】

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CF1349D】Slime and Biscuits【概率期望】【解方程】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:nnn個人共有mmm個餅干,每輪隨機選一個餅干隨機給一個另外的人,所有餅干都在一個人手里時游戲結束,求期望進行次數。模998244353998244353998244353

n≤105,m≤3×105n\leq10^5,m\leq3\times10^5n105,m3×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=ansi=1n?Pi?=1,i=1n?Ei?=ansansansans為題目所求

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=1n?[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=1n?[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=1n?[i?=x]Ei?+i=1n?[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=1n?Ex?+Ci=1n?[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=1n求和

∑i=1nEi′=n?ans+C(n?1)\sum_{i=1}^nE'_i=n\cdot ans+C(n-1)i=1n?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【概率期望】【解方程】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。