推式子的做題記錄

RoFtaCD發表於2024-05-27

「LOJ#3399」Communication Network

首先列出式子,\(ans=\sum\limits_{T_2}|T_1\cap T_2| 2^{T_1\cap T_2}\)

注意到有 \(f(S)=\sum\limits_{T\subseteq S}\sum\limits_{T'\subseteq T}(-1)^{T-T'}f(T')\)

證明可考慮計算每個 \(T'\) 的貢獻,由於 \(T'\subseteq T\subseteq S\)\(T\) 必然是 \(T'\)\(S-T'\) 的某個子集的並,於是我們嘗試列舉這個子集的大小,可得 \(T'\) 在對這個柿子結果的貢獻為 \(f(T')\sum\limits_{i=0}^{|S-T'|}\binom{|S-T'|}{i}(-1)^i=0^{|S-T'|}·f(T')\),因此只有當 \(T'=S\) 時對結果產生 \(f(T')\) 的貢獻,其餘 \(T'\) 的貢獻均為 \(0\),得證。

\(f(S)=|S|·2^{|S|}\),那麼:

\[\begin{aligned} ans&=\sum\limits_{T_2}f(T_1\cap T_2)\\ &=\sum\limits_{T_2}\sum\limits_{S\subseteq(T_1\cap T_2)}\sum\limits_{T\subseteq S}f(T)(-1)^{|S|-|T|}\\ &=\sum\limits_{S\in T_1}\sum\limits_{T\subseteq S}f(T)(-1)^{|S|-|T|}(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}\sum\limits_{T\subseteq S}2^{|T|}|T|(-1)^{|S|\color{red}{+}|T|}(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}(-1)^{|S|}\sum\limits_{T\subseteq S}(-2)^{|T|}|T|(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}(-1)^{|S|}\sum\limits_{i=0}^{|S|}(-2)^i·i·\dbinom{|S|}{i}·(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}(-1)^{|S|}\sum\limits_{i=0}^{|S|}(-2)^i·|S|·\dbinom{|S|-1}{i-1}·(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}(-1)^{|S|}·|S|·\sum\limits_{i=0}^{|S|-1}(-2)^{i+1}·\dbinom{|S|-1}{i}·(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}(-1)^{|S|}·|S|·(-2)·\sum\limits_{i=0}^{|S|-1}(-2)^{i}·\dbinom{|S|-1}{i}·1^{|S|-1-i}·(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}(-1)^{|S|}·|S|·(-2)·(-1)^{|S|-1}·(\sum\limits_{S\in T_2}1)\\ &=\sum\limits_{S\in T_1}2|S|·(\sum\limits_{S\in T_2}1) \end{aligned} \]

發現,\(\sum\limits_{S\in T_2}1\) 就是包含 \(S\) 當中邊的生成樹個數,於是題目要求的就是對於所有邊集 \(S\),包含 \(S\) 的生成樹個數乘上 \(S\) 的大小之和。

根據結論:包含 \(S\) 的生成樹個數就是 \(n^{r-2}\prod\limits_{i=1}^r a_i\),其中 \(r\)\(S\) 中的邊所形成的連通塊個數,\(a_1,a_2,\cdots,a_r\) 為這 \(r\) 個連通塊的大小。

於是答案可進一步寫成:

\[2\sum\limits_{S\in T_1}|S|·n^{r-2}\prod\limits_{i=1}^ra_i= \dfrac{2}{n^2}\sum\limits_{S\in T_1}|S|\prod\limits_{i=1}^rna_i\]

此時這玩意兒的組合意義就異常明顯了:選擇一個邊集將這棵樹分成若干個連通塊,再從每個連通塊中選擇一個點,產生 \(n\) 的乘積貢獻,最後從選定的邊集中選擇一條邊,球所有選法的貢獻之和。

這樣就可以 DP 了,\(f_{u,0/1,0/1}\) 表示確定了以 \(u\) 為根的子樹內連通塊的劃分情況,\(u\) 所在的連通塊是否選擇了點,\(u\) 子樹內是否有邊被選擇的方案數,樹上揹包轉移即可。

時間複雜度 \(\mathcal O(n)\)