定義
-
機率:某個隨機事件出現的可能性大小。
事件 \(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}\)。
-
求 \(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$。
-
並且 \(\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)\) 舉例:
此時,代入上述問題 \((2)\) 中的答案可得:
得到了相同的結果。
透過上述舉例,我們容易發現: \(\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
利用簡單容斥解決。用總機率減去一件事情也沒發生的機率。
解法2
對每件事情算他作為編號最小的發生的事件的機率是多少,注意到這樣不重不漏。
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
。由於
YES
和NO
沒有本質之分,同時出於簡化問題的考慮,不妨欽定 \(N \geq M\)。接著,易發現答案保底有 \(\max(N,M)\),即 \(N>M\) 時帶來的貢獻。原因很簡單:假設當前答案是
YES
,答對了算進貢獻;當前答案是NO
,那麼這一題答錯了、但是 \(N\) 的值依舊沒變,而 \(M\) 卻減小了。如果按照這樣下去(最壞情況),最後 \(M=0\) 之後你就能連續猜對 \(N\) 次。之後考慮 \(N=M\) 所帶來的貢獻。其實就是拿“期望出現的 \(N=M\) 的局面數”乘以 \(\frac{1}{2}\)(不管選
YES
或NO
都有 \(\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\),則二階矩有:
三階:
更高階的以此類推。
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)\) 算一下貢獻。觀察到大部分對的開頭都是獨立的,只有相鄰的位置與同一個位置的不獨立,故而分開考慮:
-
\(|i-j|>1\)
觀察到這部分是獨立的,對每個位置分開算。
-
\(|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})\)。
- 注意到上述貢獻比實際的貢獻少 \(1\)(開頭那一段),但是並不影響我們做下去。
方差
- 方差的定義
根據定義,可推出:
即平方的期望減去期望的平方。
推導過程
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\) 的位置關係進行分類討論:
-
\(x\) 在 \(y\) 的左上角(\(x\) 在 \(y\) 的右下角是等價的)
欽定 \(x,y\) 的座標分別為 \((i,j),(k,t)\),那麼當前兩個點都被矩形覆蓋到的方案數是 \(i+(n-k+1)\times j+(m-t+1)\)。
易發現每個 \(x,y\) 的貢獻值都獨立,可用靜態二維數點解決。
-
\(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\) 張的方案數。
至於查詢沒有胡牌的方案數,只需要判斷加求和就行了。