離散意義下的基礎機率與期望

徐子洋發表於2024-08-02

定義

  • 機率:某個隨機事件出現的可能性大小。

    事件 \(A\) 發生的機率記作 \(P(A)\),其取值範圍為 \([0,1]\)

  • 期望:若 \(X\) 是一個離散型的隨機變數,可能的取值為 \(x_1,x_2,\dots,x_n\),對應的機率分別為 \(p_1,p_2,\dots,p_n\),那麼它的期望值為 \(\sum_{i=1}^n p_ix_i\)

    隨機變數 \(X\) 的期望記作 \(E(X)\)

Practice 1

設隨機變數 \(X\) 的取值範圍為正整數,\(\forall 1\leq i<+\infty\), \(P(X=i)=2^{−i}\)

  1. \(E(x)\) 的值。

    答案

    \(S=E(x)=\sum_{i=1}^{\infty}\frac{i}{2^i}\),有:

    \[ \begin{align} 2S&=\sum_{i=1}^{+\infty}\frac{i}{2^{i-1}}\\ &=\sum_{i=0}^{+\infty}\frac{i+1}{2^i}\\ &=\sum_{i=0}^{+\infty}(\frac{i}{2^i}+\frac{1}{2^i})\\ &=\sum_{i=1}^{+\infty}\frac{i}{2^i}+\sum_{i=0}^{+\infty}\frac{1}{2^i}\\ &=S+\sum_{i=0}^{+\infty}\frac{1}{2^i} \end{align} \]

    又有:

    \[ \begin{align} S&=2S-S\\ &=(S+\sum_{i=0}^{+\infty}\frac{1}{2^i})-S\\ &=\sum_{i=0}^{+\infty}\frac{1}{2^i}\\ \end{align} \]

    我們成功地對 $S$ 完成了第一步的轉化。接下來:
    

    \[ \begin{align} \frac{1}{2}S&=\sum_{i=0}^{+\infty}\frac{1}{2^i}\\ &=\sum_{i=0}^{+\infty}\frac{1}{2^{i+1}}\\ &=\sum_{i=1}^{+\infty}\frac{1}{2^i}\\ &=S-1 \end{align} \]

    根據上述式子,可以列出方程:
    

    \[ \begin{align} \frac{1}{2}S&=S-1\\ S&=2S-2\\ S&=2 \end{align} \]

    解出答案 $E(x)=2$。
    
  2. 並且 \(\forall 1\leq i<+\infty\),求 \(P(X\geq i)\)

    答案

    \(S=P(X\geq i)=\sum_{j=1}^{+\infty}P(x=j)=\sum_{j=1}^{+\infty}\frac{1}{2^j}\)

    那麼有:

    \[ \begin{align} \frac{1}{2}S&=\sum_{j=i}^{+\infty}\frac{1}{2^{j+1}}\\ &=\sum_{j=i+1}^{+\infty}\frac{1}{2^{j}}\\ \end{align} \]

    根據子問題 $(1)$ 中的類似計算方法可得:
    

    \[ \begin{align} \frac{1}{2}S&=\sum_{j=i+1}^{+\infty}\frac{1}{2^{j}}\\ &=\frac{1}{2^i} \end{align} \]

    列出方程:
    

    \[ \begin{align} \frac{1}{2}S&=\frac{1}{2^i}\\ S&=\frac{1}{2^{i-1}} \end{align} \]

用 Tail Probability 求期望

有時候我們需要求解 \(E(X)\),但是我們只知道 \(P(X\geq i)\) 的值,這時候就可以利用 \(\text{Tail Probability}\) 來求解 \(E(X)\)

拿上面的問題 \((1)\) 舉例:

\[\begin{align} E(X)&=\sum_{i=1}^{+\infty}i\times P(X=i)\\ &=\sum_{i=1}^{+\infty}\sum_{j=1}^iP(x=i)\\ &=\sum_{j=1}^{+\infty}\sum_{i=j}^{+\infty}P(X=i)\\ &=\sum_{j=1}^{+\infty}P(X\geq j) \end{align} \]

此時,代入上述問題 \((2)\) 中的答案可得:

\[\begin{align} E(X)&=\sum_{j=1}^{+\infty}P(X\geq j)\\ &=\sum_{j=1}^{+\infty}\frac{1}{2^{j-1}}\\ &=2 \end{align} \]

得到了相同的結果。

透過上述舉例,我們容易發現: \(\text{Tail Probability}\) 本質是一種拆貢獻的思想,在一些情況下可能有益於解題。

期望的線性性

對於兩個隨機變數:

  • \(E(X+Y)=E(X)+E(Y)\)

    • \(X,Y\) 這兩個隨機變數不一定要獨立。
  • \(E(aX)=aE(X)\)

    • 同上,不要求 \(X,Y\) 獨立。
  • \(E(XY)=E(X)E(Y)\)

    • \(X,Y\) 必須要求獨立,不合對方的取值相關。

上述的三條利用乘法分配律自證不難。

Practice 2

給出 \(n\) 個獨立事件發生的機率 \(p_1,p_2,...,p_n\)。求至少有一個事件發生的機率。

下面給出兩種解法:

解法1

利用簡單容斥解決。用總機率減去一件事情也沒發生的機率。

\[1-\prod_{i=1}^n (1-p_i) \]

解法2

\[\sum_{i=1}^n(\prod_{j=1}^{i-1}p_j)\times p_i \]

對每件事情算他作為編號最小的發生的事件的機率是多少,注意到這樣不重不漏。

Practice 3

  • 題目:CF280C

  • 題意:給出一顆 \(n\) 個節點的有根樹(\(1\) 為根)。接下來會進行若干此操作,每次操作會從剩下的點中以相同的機率選擇一個節點,並刪去它的子樹。操作直至樹為空。求期望的操作次數。

    \(1\leq n\leq 10^5\)

  • 不妨進行拆貢獻:設隨機變數 \(X_i\) 表示 \(i\) 號點是否被操作(\(X_i=1\) 表示被選中,\(X_i=0\) 表示沒被選中),那麼有 \(answer=\sum E(X_i)\)

    考慮到 \(E(Xi)=P(X_i=1)\),而 \(P(X_i=1)\) 當且僅當它在其所有祖先之前被選中。故 \(E(X_i)=P(X_i=1)=\frac{1}{depth_i}\)

Practice 4

  • 題目:CF Gym 101234 D

  • 題意:給出一顆 \(n\) 個節點的樹。接下來會進行若干次操作,每次會刪除一個節點和所有與他相關的邊,貢獻為其所在連通塊的大小。操作直至圖為空。求期望的貢獻和。

    \(1\leq N \leq 10^5\)

  • 進行拆貢獻。考慮刪除 \(u\) 點時如果 \(v\) 點還和 \(u\) 點處於同個連通塊,那麼 \(v\)\(u\)\(1\) 的貢獻,此時滿足 \(u\)\(u\to v\) 路徑上第一個被刪除的點,機率為 \(\frac{1}{\text{dist}(i,j)+1}\)

    所以一種暴力的思路就是列舉 \(u,v\),求貢獻和。但是資料範圍較大,可以統計每種長度的路徑出現了多少次再求和,採用點分治+\(\text{FFT}\) 或者樹上啟發式合併+\(\text{FFT}\) 求解答案即可。

Practice 5

  • 題目:CF1097D

  • 題意:給定 \(n,k\),一共會進行 \(k\) 次操作,每次操作會把 \(n\) 等機率的變成 \(n\) 的某個約數。

    求操作 \(k\) 次後 \(n\) 的期望是多少,答案對 \(10^9+7\) 取。

    \(1 \le n \le 10^{15},1 \le k \le 10^4\)

  • 欽定 \(n=\prod_{i=1}^{c}p_i^{t_i}\)\(X\)\(n\) 經過 \(k\) 次操作後的隨機變數,\(X_i\)\(p_i^{t_i}\) 經過 \(k\) 次操作後的隨機變數9滿足 \(p_1,p_2,\dots,p_c\) 均為質數)。

    容易發現,\(E(X)=\prod_{i=1}^cE(X_i)\),也就是 \(E(X)\) 是一個積性函式。故而我們對 \(n\) 分解質因數後進行一遍 \(\text{DP}\) 即可。

    具體的,假設當前是 \(n\) 的第 \(id\) 個質因子,且 \(f_{i,j}\) 為經過 \(i\) 次操作後,剩下的數為 \(p_{id}^j\) 的機率。轉移為 \(f_{i,j}=\sum_{l=j}^{t_{id}}\frac{1}{l+1}f_{i-1,l}\)。最終的 \(E(X_{id})=\sum_{i=1}^{t_{id}}f_{k,i}\)

    • \(k\) 很大的時候可以使用矩陣快速冪最佳化 \(\text{DP}\)
  • 程式碼 #include <bits/stdc++.h> #define FL(i, a, b) for(int i = (a); i <= (b); i++) #define FR(i, a, b) for(int i = (a); i >= (b); i--) using namespace std; typedef long long ll; const int N = 70, K = 1e4 + 10, p = 1e9 + 7; int k; ll t, n, ans = 1, f[K][N]; int qpow(int a, int b){ int ans = 1; for(; b; a = 1ll * a * a % p, b >>= 1) if(b & 1) ans = 1ll * ans * a % p; return ans; } int inv(int x){return qpow(x, p - 2);} ll F(int a, int b){ f[0][b] = 1; ll ret = 0, sum = 0; FL(i, 1, k){ sum = 0; FR(j, b, 0){ (sum += 1ll * f[i - 1][j] * inv(j + 1) % p) %= p; f[i][j] = sum; } } FL(i, 0, b) (ret += 1ll * f[k][i] * qpow(a, i) % p) %= p; f[0][b] = 0; return ret; } int main(){ scanf("%lld%d", &n, &k), t = n; FL(i, 2, sqrt(n)){ int c = 0; while(t % i == 0) t /= i, c++; if(c) ans = 1ll * ans * F(i, c) % p; } if(t > 1) ans = 1ll * ans * F(t % p, 1) % p; printf("%lld\n", ans); return 0; }

Practice 6

  • 題目:AGC019F

  • 題意:有 \(N+M\) 個問題,其中有 \(N\) 個問題的答案是 YES\(M\) 個問題的答案是 NO。當你回答一個問題之後,會知道這個問題的答案,求最優策略下期望對多少。答案對 \(998244353\) 取模。

    $ 1\leq N,M\leq500,000$

  • 首先,不難得出選 YES 答對的機率是 \(\frac{N}{N + M}\),選 NO 答對的機率是 \(\frac{M}{N+M}\)

    於是我們有如下結論:

    假設 \(N > M\),我們必定選 YES;相反 \(M > N\),則必定選 NO

    由於 YESNO 沒有本質之分,同時出於簡化問題的考慮,不妨欽定 \(N \geq M\)

    接著,易發現答案保底有 \(\max(N,M)\),即 \(N>M\) 時帶來的貢獻。原因很簡單:假設當前答案是 YES,答對了算進貢獻;當前答案是 NO,那麼這一題答錯了、但是 \(N\) 的值依舊沒變,而 \(M\) 卻減小了。如果按照這樣下去(最壞情況),最後 \(M=0\) 之後你就能連續猜對 \(N\) 次。

    之後考慮 \(N=M\) 所帶來的貢獻。其實就是拿“期望出現的 \(N=M\) 的局面數”乘以 \(\frac{1}{2}\)(不管選 YESNO 都有 \(\frac{1}{2}\) 的機率答對)。具體的,我們對於前者,進行拆貢獻。現在問題就轉化為了求出現某個給定局面的機率,組合數求解即可。

    程式碼
    #include <bits/stdc++.h>
    #define FL(i, a, b) for(int i = (a); i <= (b); i++)
    #define FR(i, a, b) for(int i = (a); i >= (b); i--)
    using namespace std;
    const int N = 1e6 + 10, p = 998244353;
    int n, m, s, ans, fac[N];
    int qpow(int a, int b){
    	int ans = 1;
    	while(b){
    		if(b & 1) ans = 1ll * ans * a % p;
    		b >>= 1, a = 1ll * a * a % p;
    	}
    	return ans;
    }
    int inv(int x){return qpow(x, p - 2);}
    int C(int n, int m){
    	if(n < m || n < 0) return 0; if(!m) return 1;
    	return 1ll * fac[n] * inv(fac[n - m]) % p * inv(fac[m]) % p;
    }
    int main(){
    	scanf("%d%d", &n, &m); if(m > n) swap(n, m);
    	fac[0] = 1;
    	FL(i, 1, n + m) fac[i] = 1ll * fac[i - 1] * i % p;
    	FL(i, 1, m)
    		(ans += 1ll * C(i * 2, i) * C(n - i + m - i, n - i) % p) %= p;
    	printf("%d\n", (1ll * ans * inv(C(n + m, n)) % p * inv(2) + n) % p);
    	return 0;
    } 
    

求高階矩

  • 若我們關心的隨機變數 \(X\) 可以拆成 \(\sum_{i=1}^n X_i\),則二階矩有:

\[\begin{align} E(X^2)&=E((\sum_{i=1}^n X_i)^2)\\ &=E(\sum_{i=1}^n\sum_{j=1}^n X_iX_j)\\ &=\sum_{i=1}^n\sum_{j=1}^n E(X_iX_j) \end{align} \]

三階:

\[\begin{align} E(X^3)&=E((\sum_{i=1}^n X_i)^3)\\ &=E(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n X_iX_jX_k)\\ &=\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n E(X_iX_jX_k) \end{align} \]

更高階的以此類推。

Practice 7

  • 題目:CF1187F

  • 題意:有一個長度為 \(n\) 的序列 \(x\)。定義 \(B(x)\)\(x\) 的顏色段數。
    對於 \(\forall 1\leq i\leq n\)\(x_i\) 將等機率為 \([l_i,r_i]\) 中的一個整數顏色。

    給出所有 \(l_i,r_i\),求 \(E((B(x^2))^2)\),即平方的期望。

  • 考慮在每一段的開頭算貢獻:只要它和前面的數不同,它就是某一段的開頭。

    • 注意到上述貢獻比實際的貢獻少 \(1\)(開頭那一段),但是並不影響我們做下去。
      於是我們利用上述求二階矩的方法,對於每一對開頭 \((i,j)\) 算一下貢獻。觀察到大部分對的開頭都是獨立的,只有相鄰的位置與同一個位置的不獨立,故而分開考慮:
    1. \(|i-j|>1\)

      觀察到這部分是獨立的,對每個位置分開算。

    2. \(|i-j|\leq 1\)

      \(i=j\) 比較顯然。對於 \(j=i+1\),進行一個容斥(當前條件下,\(i,j\) 均為顏色段開頭當且僅當 \(x_{i-1}\not=x_i\)\(x_{i}\not=x_{j}\)):貢獻為 \(1-P(x_{i-1}=x_i)-P(x_{i}=x_{j})+P(x_{i-1}=x_i=x_{j})\)

方差

  • 方差的定義

\[Var(X)=E((X-E(X))^2) \]

根據定義,可推出:

\[Var(X)=E(X^2)-E(X)^2 \]

即平方的期望減去期望的平方。

推導過程

\[\begin{align} Var(X)&=E((X-E(X))^2)\\ &=E((X-E(X))\times(X-E(X)))\\ &=E(X^2+E(X)^2-2\times X\times E(X))\\ &=E(X^2)+E(X)^2-E(2\times X\times E(X))\\ &=E(X^2)+E(X)^2-2\times E(X)^2\\ &=E(X^2)-E(X)^2 \end{align} \]

Practice 8

  • 題意:給定一個大小為 \(n\times m\) 的矩形,某一些格子上有物品,共有 \(k\) 個物品,現在等機率選一個子矩形,求子矩形內物品個數的方差。

  • 由於 \(Var(X)=E(X^2)-E(X)^2\),故考慮分別求等號後的兩項。

    \(E(X)^2\) 比較好算。根據期望的線性性,可以拆成 \(\sum_{i=1}^n\sum_{j=1}^m P((i,j)\text{ 被子矩形覆蓋到的機率})\),而他的機率就等於被覆蓋到的方案數除以矩形的總數。後者的方案數易得(因為行和列是獨立的),現在只關心前者——對於一個點 \((i,j)\),它被覆蓋到的方案數就是 \(i\times(n-i+1)\times j\times(m-j+1)\)

    \(E(X^2)\) 可以轉化為:對於每一對點,統計包含它們的矩形的個數。\(k\) 較小的時候顯然可以暴力求解,但在 \(k\) 大的時候還需要進一步的分析——我們不妨對兩個點 \(x,y\) 的位置關係進行分類討論:

    1. \(x\)\(y\) 的左上角(\(x\)\(y\) 的右下角是等價的)

      欽定 \(x,y\) 的座標分別為 \((i,j),(k,t)\),那麼當前兩個點都被矩形覆蓋到的方案數是 \(i+(n-k+1)\times j+(m-t+1)\)

      易發現每個 \(x,y\) 的貢獻值都獨立,可用靜態二維數點解決。

    2. \(x\)\(y\) 的右上角(\(x\)\(y\) 的左下角)

      欽定 \(x,y\) 的座標分別為 \((i,j),(k,t)\),那麼當前兩個點都被矩形覆蓋到的方案數是 \(k+(n-i+1)\times j+(m-t+1)\)

      同上。

Practice 9

  • [ZJOI2019]麻將

  • 首先,必須先考慮一副牌是否是“胡”的,不然解決這道期望題就是無稽之談。所以我們可以先把 \(7\) 個對子的特殊情況判掉,接下來用 \(\text{DP}\) 判斷 \(1\) 個對子、\(4\) 個面子的情況。

    \(f_{i,j,k,t}\) 表示考慮了前 \(i\) 種牌,是否已經有對子了(\(j=0\) 表示否,\(j=1\) 表示是),多餘的像 \(i,i-1\) 這樣的一組牌有 \(k\) 組,多餘的第 \(i\) 種牌有 \(t\) 個的情況下,最大產生的面子數量。

    接下來來回到這道題。設 \(X\) 表示最早產生胡牌的輪數的隨機變數,\(p(x)\) 表示恰好 \(x\) 輪時第一次產生了胡牌的機率。

    \[ E(X)=\sum_{x=0}^{4n-13} x \times p(x) \]

    \[ E(X)=\sum_{x=0}^{4n-13} \sum_{i=0}^{n-1} \times p(x) \]

    \[ E(X)=\sum_{i=0}^{4n-13} \sum_{x=i+1}^{4n-13} \times p(x) \]

    \[ E(X)=\sum_{i=0}^{4n-13} P(\text{x輪時還沒有胡牌的機率}) \]

    \[ E(x)=\sum_{i=0}^{4n-13} \frac{\text{x輪時還沒有胡牌的方案數}}{C_{4n-13}^i} \]

    所以我們的重中之重就是求出 \(x\) 輪還沒有胡牌的方案數。

    我們使用 \(\text{DP}\)\(\text{DP}\) 解決此問題。我們把上述簡易 \(\text{DP}\) 的狀態和其對應的對子數量作為內層 \(\text{DP}\) 狀態給壓縮起來(注意 \(i\) 那維不要壓進去,之後會把那一維單獨地放入外層的狀態裡),我們發現實際有用的狀態可能很少,故而用搜尋找。那麼我們外層的狀態就顯而易見了:\(dp_{i,j,k}\) 表示前 \(i\) 種牌,內層狀態為 \(j\),總共選了 \(k\) 張的方案數。

    至於查詢沒有胡牌的方案數,只需要判斷加求和就行了。

相關文章