計數與概率期望小結


好久沒寫過總結了,感覺有的東西不寫一寫很容易忘,還是寫一點東西。

計數

組合數

BZOJ4870 [SHOI2017] 組合數問題

題意

給定四個整數 \(n,p,k,r\) ,求 \(\displaystyle\sum_{i = 0}^{\infty} \binom{nk}{ik+r} \bmod p\)

\(1 \le n \le 10^9,0 \le r < k \le 50,2 \le p \le 2^{30} - 1\)

技巧:考慮組合數的意義,轉化問題。

題解

考慮上面的組合數的意義,我們可以將題目轉化為,我們要在 \(nk\) 個物品中,選出 \(\bmod p = r\) 個物品的方案數。這個東西可以直接DP,然后矩陣乘法加速即可。

UOJ275 [清華集訓2016] 組合數問題

題意

小蔥想知道如果給定 \(n,m\)\(k\),對於所有的 \(0 \le i \le n,0 \le j \le \min(i,m)\) 有多少對 \((i,j)\) 滿足 \(\binom{i}{j}\)\(k\) 的倍數。

答案對 \(10^9+7\) 取模。

\(1 \le n,m \le 10^{18},1 \le t,k \le 100\),且 \(k\) 是一個質數。

技巧:利用盧卡斯定理對於條件轉化

題解

首先由盧卡斯定理,原題的限制可以轉化為,求數對 \((i,j)\) 滿足 \((i,j)\)\(k\) 進制下,必定存在某一位,滿足 \(i\) 在這一為比 \(j\) 小,且 \(i \le n,j \le min(i,m)\) 。這個證明很簡單,直接用盧卡斯定理,一直迭代下去就可以了。

接下來用一個數位DP做一下就可以了。記 \(dp[i][0/1][0/1][0/1][0/1]\) 表示當前填到了第 \(i\) 位,第一個數是否達到上界,第二個數是否達到 \(m\) 的上界,第二個數是否達到 \(i\) 的上界,是否存在某一位滿足第一個數的某一位小於第二個數。注意第二個數的兩個上界是要分開記的,否則轉移的時候會轉移串。這個自己寫的時候會發現這個問題。轉移枚舉兩個數下一位分別是什么即可。

UOJ300 [CTSC2017] 吉夫特

題意

給定一個長度為 \(n\) 的數列 \(a_i\) ,求有多少個長度不小於 \(2\) 的子序列 \(a_{b_1},a_{b_2},\cdots,a_{b_k}\),滿足 \(\displaystyle\prod_{i = 2}^{k} \binom{a_{b_{i - 1}}}{a_{b_i}} \bmod 2 > 0\)

\(1 \le n \le 211985,a_i \le 233333\)\(a_i\) 互不相同。

技巧:盧卡斯定理轉化條件,利用分塊思想平攤掉修改與查詢的復雜度。

題解

首先,和上一題一樣,利用盧卡斯定理轉化條件,可以得到,我們只要求有多少長度不小與 \(2\) 的子序列 \(a_{b_1},a_{b_2},\cdots,a_{b_k}\) ,滿足后一個數是前一個數的子集。

不難想到記 \(dp[i][S]\) 表示到第 \(i\) 個數,當前最靠后的數為 \(S\) 的方案。直接的話,由於 \(a_i\) 互不相同,復雜度是 \(3^{18}\) ,不足以通過此題。

我們考慮我們轉移的時候,如果我們記的 \(S\) 是上面這種,那么每次修改是 \(O(1)\) ,查詢的時候復雜度最壞是 \(2^{18}\) ;如果我們記的 \(dp[i][S]\) 是所有 \(S\) 的子集的方案,那么我們每次修改的時候,復雜度最壞是 \(2^{18}\) ,但是查詢是 \(O(1)\) 的。我們考慮平攤一下復雜度,即我們即 \(dp[i][S1][S2]\) 表示到第 \(i\) 個數,最后一個數前 \(9\) 位為 \(S1\) ,后 \(9\) 位為 \(S2\) 或者 \(S2\) 的子集的方案數。這樣相當於把修改和查詢最壞復雜度都降到了 \(O(2^9)\) ,總時間復雜度即為 \(O(6^9)\)

其他

課件里還講了如何 \(O(\sqrt{n}\log n)\) 求組合數,不過分塊打標更加優秀,也就沒啥意義了。

組合計數

AGC001E BBQ HARD

題意

\(n\) 組燒烤材料,每組有 \(a_i\) 片牛肉和 \(b_i\) 片青椒。需要從中選擇兩組材料,並把材料串在一起排列,問有多少種排列方案。兩種方案不同,當且僅當選擇的材料不一樣,或者排列的方式不一樣。

\(n \le 200000,a_i,b_i \le 2000\)

技巧:組合意義的轉化

題解

考慮把題目轉化為,二維平面內有 \(2n\) 個點。每組材料對應點 \((-a_i,-b_i)\) 和點 \((a_i,b_i)\) 。接下來方案數就是所有第三象限的點走到第一象限的方案數之和,減去自己走到自己的方案數。

AGC002F Leftmost Ball

題意

\(n\) 種顏色的球,編號為 \(1\)\(n\) ,每種有 \(k\) 個。將這 \(nk\) 個球排成一排,將每種顏色從左至右第一個球染成顏色 \(0\) 。求最后能得到多少種不同的序列。

\(1 \le n,k \le 2000\)

技巧:計數限制條件的轉化

題解

由題目的限制,可以發現一個這樣的性質,從左到右第 \(i\)\(0\) 的左邊最多出現了 \(i - 1\) 種顏色。然后每次填的時候會有兩種決策,一種是加入一個新的顏色,另一種是加一個 \(0\) 。由於每種顏色個數還有限制,直接順次填還是不方便,因此可以一次填上所有一種顏色,這個可以直接用組合數計算。然后就可以記 \(dp_{i,j}\) 表示確定了 \(i\)\(0\)\(j\) 種顏色的方案數,轉移比較顯然了。

簡單計數

題意

\(n\)\([1,m]\) 內的變量,其中 \(i\) 不能連續出現超過 \(a_i\) 次,求方案數。

\(1 \le a_i \le n \le 5000,1 \le m \le 10^5\)

技巧:簡化相同轉移降低復雜度

題解

首先不難想到一個 \(dp\) 。設 \(dp[i][j]\) 表示前 \(i\) 個數,最后一個數為 \(j\) 的方案數。容易寫出一個簡單的 \(dp\)

\[dp[i][j] = \sum_{k=1}^{m}dp[i-1][ k] - \sum_{k=1}^{m}[k \not= j] dp[i-a_i-1][k] \]

直接轉移是 \(O(nm)\) 的,需要優化。注意到對於 \(a_i\) 相同的數,\(dp\) 值是相同的,因此可以一起轉移。復雜度優化為 \(O(n^2 + m)\)

FFT輔助計數

簡單樹題

題意

給定一個 \(n\) 個點的樹,對於每一個 \(1 \le k \le n\) ,求有多少個 \(k\) 個點的集合可以用至多一條路徑覆蓋。

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

技巧:點分治+FFT的樹上計數的套路

題解

如果我們將一個合法的點集記在滿足條件的長度最小的鏈上,那么我們的計數會更加方便。考慮樹上一條長度為 \(i\) 的路徑,由於我們把貢獻記在了長度最小的路徑上,因此我們必須強制選擇路徑兩端的點,那么我們記在這條路徑上的方案數就是組合數的形式 。因此我們只要統計對於所有的 \(i\) ,長度為 \(i\) 的路徑條數。這個問題可以用經典的點分治+FFT實現。

生成函數

生成函數最基本的用法,輔助計數

BZOJ3771 Triple

題意

有若干個互不相同的正整數 \(a_i\) ,從中選出至多三個,求選出的數的和為每種情況的方案數。

\(a_i \le 40000\)

技巧:生成函數的基本運用

題解

算是生成函數中比較簡單的題目了。我們可以直接構造普通型生成函數,然后容斥掉重復取同一個的貢獻就可以了。

此外,生成函數還可以用來優化一些遞推式的計算。

舉個很簡單的例子,我們構造一個斐波那契數列的生成函數為 \(F(x) = \displaystyle\sum_{i = 0}^{\infty}fib_nx^n\) ,由於 \(fib_i = fib_{i - 1} + fib_{i - 2},f_0 = f_1 = 1\) ,所以 \(F(x) = F(x)x + F(x)x^2 + 1\) 。於是 \(F(x) = \frac{1}{1 - x - x^2}\) 。於是可以用多項式求逆,解出 \(F(x)\)

注意,寫生成函數的時候一定不要忘了邊界項!

雖然這個問題直接遞推更快,但對於某些問題,就必須利用到生成函數了,比如下面這道題,也是這類問題的一個模板題。

CF438E The Child and Binary Tree

題意

給出一個正整數集合 \(c_i\) ,對於所有 \(1 \le i \le m\) 求出有多少形態不同的二叉樹點權均屬於這個集合且點權和為 \(i\)

\(1 \le m,c_i \le 10^5\)

技巧:生成函數解決遞推式的問題。

題解

我們設 \(f(i)\) 表示二叉樹點權和為 \(i\) 的方案數,\(a(x)\) 表示是否存在 \(c_i = x\) 。所以我們會有 \(f(0) = 1,f(i) = \displaystyle\sum_{x,y}f(x)f(y)a(i-x-y)\)

如果我們用 \(F(x)\) 表示 \(f(i)\) 的生成函數,\(A(x)\) 表示 \(a(i)\) 的生成函數,那么我們會有:

\[\begin{aligned} F(x) &= F(x)^2A(x) + 1 \\ \Leftrightarrow F(x) &= \frac{1 \pm \sqrt{1 - 4A(x)}}{2A(x)} \end{aligned} \]

然后這個求逆的地方,由於 \(A(x)\) 沒有常數項,直接求逆會涼掉,因此得轉化一下。

\[F(x) = \frac{2}{1 \pm \sqrt{1 - 4A(x)}} \]

然后求逆的時候用那個常數項非 \(0\) 的解去求即可。

這里多啰嗦一句多項式開方,其實也很簡單,同樣是利用倍增+FFT去求。假設我們已經求出了在模 \(x^n\) 的意義下,\(A(x)\) 的平方根 \(B'(x)\) ,我們要求 \(A(x)\) 在模 \(x^{2n}\) 的意義下,\(A(x)\) 的根式 \(B(x)\) 。於是我們會有

\[B^2(x)-2B(x)B'(x)+B'^2(x)\equiv 0\pmod {x^{2n}} \]

解得

\[B(x)=\frac{A(x)+B'^2(x)}{2B'(x)} \]

於是求逆一下就可以了。

第一類斯特林數

第一類斯特林數 \(S_1(n,m)\) 表示把 \(n\) 個元素排成 \(k\) 個環的方案數,於是我們可以直接得到:

\[S_1(n,k) = S_1(n - 1,k - 1) + (n - 1)S_1(n -1,k) \]

第一類斯特林數的生成函數可以用這個東西表示:

\[\sum_{i = 0} ^ {n}S_1(n,i) x^i = \prod_{i = 0}^{n - 1}(x + i) \]

這個生成函數可以直接利用之前的遞推式直接得到。由於 \(S_1(n,i)\) 對應的生成函數的項的次數為 \(i\) ,我們可以對着遞推式理解一下。當我們給這個生成函數乘上一個新的項 \((x + i)\) 的時候,如果我們在這里選擇乘上 \(x\) ,相當於給我們的多項式次數 \(+1\) ,對應遞推式中 \(S_1(n - 1,k - 1) \rightarrow S_1(n,k)\) ,如果我們在這里選擇乘上 \(i\) ,相當於多項式的次數不變,但是乘上了一個 \(i\) 的系數,對應遞推式中 \((n - 1)S_1(n - 1,k) \rightarrow S_1(n,k)\)

這樣的話,第一類斯特林數就可以用分治+FFT在 \(O(n \log ^ 2 n)\) 的時間內求出來了。但是這還不夠優秀。利用倍增+FFT,我們可以把復雜度優化到 \(O(n \log n)\)

具體來說,令 \(\displaystyle F_n(x) = \prod_{i = 0}^{n - 1}(x + i)\),那么 \(F_{2n}(x) = F_n(x) F_n(x + n)\) 。而

\[\begin{aligned} F_n(x+n) &= \sum_{i = 0}^{n - 1}S_1(n,i)(x+n)^i \\&= \sum_{i = 0}^{n - 1}S_1(n,i)\sum_{j=0}^i \binom{i}{j}x^jn^{i-j} \\&= \sum_{j = 0}^{n - 1}x^j \sum_{i=j}^{n - 1} \binom{i}{j}S_1(n,i)n^{i-j} \end{aligned} \]

把式子拆開,就可以發現這是一個卷積形式。於是我們可以用倍增+FFT在 \(O(n\log n)\) 的時間內求解。

此外還有一個定義叫有符號第一類斯特林數,它的值就是在 \(S(n,k)\) 的基礎上乘上一個 \((-1)^{n-k}\) 。它的生成函數為

\[\sum_{i = 0} ^ {n}S_1(n,i) x^i = \prod_{i = 0}^{n - 1}(x - i) \]

第一類斯特林數和上升下降冪還有這樣的轉化:

\[\begin{aligned} x^{\overline{n}} &= \sum_{i = 0}^{n}S_1(n,i)x^i \\ x^{\underline{n}} &= \sum_{i = 0}^{n}S_1(n,i)(-1)^{n - i}x^i \end{aligned} \]

其中 \(x^{\underline{i}}\)\(x^{\overline{i}}\) 分別表示 \(x\)\(i\) 次下降冪與上升冪。

第二類斯特林數

第二類斯特林數 \(S_2(n,m)\) 表示把 \(n\) 個元素分成 \(k\) 個非空集合的方案數,於是我們可以直接得到:

\[S_2(n,k) = S_2(n - 1,k - 1) + kS_2(n -1,k) \]

利用容斥原理,我們可以得到第二類斯特林數的另外一個求法:

\[S_2(n,m)=\frac{1}{m!}\sum_{k=0}^{m}(-1)^kC(m,k)(m-k)^n \]

這里的容斥利用的是,枚舉有幾個集合是空的。注意到每個集合都是一樣的,所以最后答案要除一個 \(m!\)。利用NTT可以直接在 \(O(n\log n)\) 的時間內求出答案。

第二類斯特林數和上升下降冪還有這樣的轉化:

\[\begin{aligned} x^n &= \sum_{i = 0}^{n}S_2(n,i)x^{\underline{i}} \\ &= \sum_{i = 0}^{n}S_2(n,i)(-1)^{n - i}x^{\overline{i}} \end{aligned} \]

其中 \(x^{\underline{i}}\)\(x^{\overline{i}}\) 分別表示 \(x\)\(i\) 次下降冪與上升冪。

CF932E Team Work

題意

\(\displaystyle\sum_{i=0}^{n}C(n,i) \times i^k\) 的值。

\(1 \leq n \leq 10^9,1 \leq k \leq 5 \times 10^3\)

技巧:斯特林數的經典轉化

題解

利用普通冪與下降冪在第二類斯特林數的轉化,我們可以得到:

\[\begin{aligned} \sum_{i=0}^{n}C(n,i) \times i^k &= \sum_{i=0}^{n}\binom{n}{i}\sum_{j=0}^{k}S_2(k,j)\binom{i}{j}j! \\ &= \sum_{i=0}^{n}\sum_{j=0}^{k}S_2(k,j) \binom{i}{j} \binom{n}{i}j! \\ &= n!\sum_{i=0}^{n}\sum_{j=0}^{k}S(k,j) \frac{1}{(n-i)!} \frac{1}{(i-j)!} \\ &= n!\sum_{i=0}^{n}\sum_{j=0}^{k}S_2(k,j) \binom{n-j}{n-i} \frac{1}{(n-j)!} \\ &= n!\sum_{j=0}^{k}S_2(k,j)\sum_{i=0}^{n}\binom{n-j}{n-i} \frac{1}{(n-j)!} \\ &= n!\sum_{j=0}^{k}S_2(k,j) 2^{n-j} \frac{1}{(n-j)!} \\ &= \sum_{j=0}^{k}S_2(k,j) 2^{n-j} n^{\underline{j}} \end{aligned} \]

於是就做完了,問題的關鍵一步在於冪次與下降冪的轉化。

容斥原理

ARC093F Dark Horse

題意

\(2^n\) 名選手,編號為 \(1\)\(2^n\) 。現在這 \(2^n\) 名選手將進行 \(n\) 輪淘汰賽,決出勝者。若 \(x < y\) ,則 \(x\) 能夠戰勝 \(y\) 。但有 \(m\) 個例外,\(1\) 號選手會輸給這 \(m\) 個選手。問有多少中排列方式使得 \(1\) 號選手取得勝利。

\(n,m \le 16\)

技巧:容斥之后,利用DP來加速求解

題解

為了方便,定義這 \(m\) 個人組成的集合為集合 \(A\) 。容易發現,與 \(1\) 號選手交戰的選手,對應了 \(n\) 個區間內的編號最小值。如果只算某一個區間中集合 \(A\) 有人晉級的方案數,可能會有算重的情況。所以可以想到一個容斥,即計算滿足集合 \(S\) 所包含的所有區間中,集合 \(A\) 有人晉級的方案數。最后容斥一下。

這個東西還是不大好算,於是考慮使用DP計數。設 \(dp_{i,j}\) 表示選出了集合 \(A\) 中前 \(i\) 大的選手,且集合 \(S\) 中所包含的區間均有集合 \(A\) 中的人晉級的方案數。轉移還是比較顯然的。

Upd : 這寫的什么玩意兒……看這里

CF995F Cowmpany Cowmpensation

題意

給出一棵 \(n\) 個點的有根樹,每個點可以有一個 \([1,d]\) 內的整數邊權,問有多少種點權滿足兒子權值不大於父親。

\(1 \le n \le 3000,1 \le D \le 10^9\)

技巧:利用容斥降低DP的復雜度

題解

容易想到枚舉這棵樹內一共出現了多少種數字,然后用組合數去計算最后的答案。但是直接DP的話,合並的時候你需要枚舉重復的數字,復雜度相當高,需要簡化一下問題。

考慮容斥,將恰好 \(j\) 種數字轉化為至多 \(j\) 種數字。設 \(dp_{i,j}\) 表示以 \(i\) 為子樹,至多出現了 \(j\) 種數字的方案數。轉移的時候記一個前綴和就可以做到 \(O(n^2)\) 的復雜度。

概率與期望

題目我做了一些刪減,過水太難的就刪掉了……

普通期望題

概率與期望題,首先記住:概率順推,期望倒推。因為期望順推的話,你還需要多求一個概率。在不好求概率的時候倒推期望是最合適的。

CF605E Intergalaxy Trips

題意

\(n\) 個點,每天 \(i\) 號點到 \(j\) 號點的有向道路有 \(p_{i,j}\) 的概率開放。每天可以走一條開放的道路或者留在原地,求從 \(1\) 號點走到 \(n\) 號點最優的期望時間。注意,你的策略可以隨着道路的開放與否做出改變。

\(1 \le n \le 1000\)

技巧:期望倒推的利用,與貪心的結合

題解

我們設 \(f(x)\) 表示從 \(x\) 節點到 \(n\) 節點最優時間的期望,那么我們的最優策略肯定是,在所有你能到的節點中,走向期望時間最短的點。如果這個點的期望時間大於本身,那么就留在這個點,等待下一次。

那么我們可以考慮按照期望的大小從小到大確定每個點的答案。每次從所有未確定的點中,選擇一個當前期望值最小的點。由於我們不會走向期望時間比自己大的點,因此,這樣做是正確的。我們設 \(a_i\) 表示 \(f(x)\)\(i\) 小的點的編號,那么我們有:

\[f(a_i) = 1 + \sum_{j = 1}^{i}f(a_j) P_{a_i,a_j}\prod_{k = 1}^{j - 1}(1 - p_{a_i,a_k}) \]

這里在確定一個點之后,對於每個未確定的點維護一下新的答案,就可以在 \(O(n^2)\) 的時間內解決了。

BZOJ5058 期望逆序對

題意

給定一個 \(1\)\(n\) 的排列,求 \(k\) 次隨機交換之后,期望逆序對的數量。

\(n \le 500000,k \le 10^9\)

技巧:考慮某一對或某個物品對於答案的貢獻;考慮末狀態的期望

題解

考慮每對數字對答案的貢獻。每對數字 \(a_i,a_j\) 在末狀態的時候,所處位置有三種可能的情況,位於 \(i\) ,位於 \(j\) ,位於其他的位置。注意到在這里,每個點位於其他位置的概率是均等的。因此 \((i,j)\) 這個數對的位置情況可以歸為 \(7\) 種。把這 \(7\) 種情況的轉移寫成一個矩陣,就可以求出每種位置情況的概率。

直接對於每一個數對統計答案的話,時間復雜度仍然是 \(O(n^2)\) 的,於是我們要用一個BIT來統計貢獻。這玩意兒有點難寫,具體實現還是看代碼比較好……

CF838D Airplane Arrangements

題意

\(n\) 個人排成一排,有 \(m\) 個人依次進場選位置。每個人開始會選擇一個方向(從左至右或從右至左)並選擇一個位置。他會走到他選擇的那個位置,如果那個位置被人占用了,他會沿着他選擇的方向一路走到第一個空位並坐下。求有多少種情況滿足每個人都有座位。

\(1 \le m \le n \le 10^6\)

技巧:巧妙的建模,找到概率相同的量

題解

把所有位置看成一個 \(n + 1\) 個點的環。其中第 \(n + 1\) 個點是一個特殊點,如果有人占據了這個點,那么意味着有人沒有座位。如果我們假設這 \(m\) 個人可能以 \(n + 1\) 號點為起點,這顯然不會影響合法的答案。但是這樣修改了一下之后,每個人坐在每個位置上的概率是均等的。所以答案就是 \(\frac{n + 1 - m}{n + 1}(2n+2)^m\)

樹上高斯消元解決樹上期望問題

這種題主要還是要熟悉一下套路,一般來講,可以把 \(dp\) 的式子寫成 \(f(x) = A_xf(fa[x]) + B_x\)。然后從下到上一路推到根,就可以求出整棵樹的 \(dp\) 值。

LOJ2542 隨機游走

題意

給定一棵 \(n\) 個結點的樹,你從點 \(x\) 出發,每次等概率隨機選擇一條與所在點相鄰的邊走過去。

\(Q\) 次詢問,每次詢問給定一個集合 \(S\),求如果從 \(x\) 出發一直隨機游走,直到點集 \(S\) 中所有點都至少經過一次的話,期望游走幾步。

特別地,點 \(x\) 視為一開始就被經過了一次。

\(1 \le n \le 18,1 \le Q \le 5000\)

技巧:樹上高斯消元;MinMax容斥

題解

題意等價於,給定一個點集,求經過這個點集里的點的時間的Max的期望。Max的期望可以說相當不好求,這里考慮利用MinMax容斥,將時間Max的期望轉化為時間Min的期望。MinMax容斥的式子大概長這樣:

\[\displaystyle \max\{S\}=\sum_{T\subseteq S}(-1)^{|T|-1}\min\{T\} \]

證明大概可以這樣考慮。設 \(\max\{S\} = x\),將除了 \(\{x\}\)\(\varnothing\) 之外,將所有集合兩兩配對。配對方式就是將一個不含 \(x\) 的集合和這個集合加上 \(x\) 這個元素形成的集合配對。這樣兩個集合的最小值肯定是相等的,會相互抵消。最后剩下的集合中,空集沒有最小值,故答案即為 \(x\)

MinMax容斥之后,我們就只要求第一次經過某個點集的期望時間了。設 \(f(x,S)\) 表示從 \(x\) 出發,第一次經過集合 \(S\) 中的點的期望時間。這個東西可以分兩類討論:

\(x \in S\) ,則 \(f(x) = 0\)

\(x \not\in S\) ,則\(\displaystyle f(x)=[f(fa[x])+1+\sum (f(ch[x])+1)] \times \frac{1}{deg[x]}\)

利用樹上高斯消元,將 \(f(x)\) 表示為 \(A(x)f(fa[x]) + B(x)\) 的形式。於是我們有

\[\displaystyle (1-\frac{\sum A_v}{deg[u]}) f(u) = \frac{1}{deg[u]}f(\mathrm{fa}[u])+(1+\frac{\sum B_v}{deg[u]}) \]

把左邊除過去,然后就可以得到答案了。

似乎這個復雜度並不是出題人給出的正解?但是還是能跑得過。

Trip

題意

給定一棵 \(n\) 個點,以 \(1\) 號點為根的樹,每個點為黑色或白色。從 \(1\) 號點出發,每次隨機走向一個相鄰的節點。如果該點為黑色或第一次經過該點,則計數器加 \(1\) 。如果走到葉子節點整個過程將結束。求計數器的值的期望。

\(n \le 10^6\)

技巧:樹上高斯消元,期望綜合難題;大膽設出未知數。

題解

首先考慮只有黑點的時候,該怎么做。黑點是經過一次就算一次貢獻,如果我們設 \(f(x)\) 表示從 \(x\) 出發,經過的黑點的期望個數,那么我們就可以得到一個DP方程

\[f_i = [i \ is \ black] + [deg[i] > 1]\frac{\sum f(j)}{deg[i]} \]

其中 \(j\) 為所有與 \(i\) 相鄰的點。那么這里直接用樹上高斯消元即可解決。

接下來考慮只有白點的情況。由於白點只在第一次經過的時候做出貢獻,那么我們只需求出經過白點的概率 \(g_i\) 。由於當我們從 \(1\) 號點出發的時候,想要經過 \(i\) ,必須經過 \(fa_i\) 。我們設 \(h_i\) 為從 \(fa_i\) 走到 \(i\) 節點的概率,那么我們有 \(g_i = g_{fa_i} \times h_i\)

考慮我們該如何求 \(h\) 。設 \(a_i\) 表示從 \(i\) 走到 \(fa_i\) 的概率,那么我們有這樣一個式子:

\[h_i = \frac{1}{deg_{fa_i}}(1 + h_ih_{fa_i} + \sum a_jh_i) \]

其中 \(j\)\(i\) 的兒子節點。

解釋一下這個式子。第一項表示我第一步就到了 \(i\) 節點;第二項表示我第一步走到了父親節點,那么我為了走到 \(i\) 節點,就要往下走兩步,概率分別為 \(h_{fa_i}\)\(h_i\) 。第三項表示我第一步走到了其他的兒子節點,那么我需要先往上走一步,再往下走一步。

為了求 \(h\) 我們還得求 \(a\) 。不過所幸 \(a\) 求起來是很簡單的。容易發現這樣一個式子:

\[a_i = \frac{1}{deg_i}(1+\sum a_ja_i) \]

同樣 \(j\)\(i\) 的兒子節點。這個式子理解起來很簡單。第一項就是一步走對,第二項就是往下走了,然后要往上走兩步。

以上的 \(h\)\(a\) 均用樹上高斯消元都可以求出來,於是問題終於解決啦!


免責聲明!

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



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