1. 程式人生 > 其它 >【COCI2011-2012#6F】KOŠARE

【COCI2011-2012#6F】KOŠARE

題意

https://www.luogu.com.cn/problem/P6442

\(n\) 個箱子、 \(m\) 種禮物,第 \(i\) 個箱子裡有 \(k_i\) 種禮物。需要選出一些箱子,要求每一種禮物至少出現在一個箱子中。求可行的方案數 \(\mod 10^9+7\)

社論

輸入複雜度略大,如果全部記下來留給後面遍歷幾乎是不可能的,注意箱子的標號是一個無用資訊,禮物的組成方案一共就 \(2^m-1\) 種,開個陣列 \(\text{cnt}\) 去記一下每類的數量即可。至少出現在一個箱子中 看起來是一個“並”運算,所以考慮集合並卷積,輸入就轉化成了\(2^m\) 個只有兩項的集合生成函式,即 \(\forall state\in 2^U\)

,有

\[ f_{state}(z)=z^\varnothing+(2^{\text{cnt}_{state}}-1)z^{state} \]

\(F(z)=\prod_{state\in2^U} f_{state}(z)\text{,注意此處乘法代表集合並卷積}\)。我們最終需要求的即

\[ [z^U]F(z) \]

\(F(z)\) 作莫比烏斯變換,就有

\[ [z^S]\hat{F}(z)=\prod\limits_{state\in2^U} [z^S]\hat{f}_{state}(z) \]

最終需要求的即

\[ [z^U]F(z)=\sum\limits_{T\subseteq U}(-1)^{|U|-|T|}[z^T]\hat{F}(z) \]

所以關鍵就是把 \(\hat{F}(z)\)

的係數給算出來。然而

\[ [z^S]\hat{f}_{state}=\sum\limits_{T\subseteq S}[z^T]f_{state}=1+[state\subseteq S](2^{\text{cnt}_{state}}-1) \]

於是

\[ \begin{aligned} [z^S]\hat{F}(z)&=\prod\limits_{state\in 2^U}(1+[state\subseteq S](2^{\text{cnt}_{state}}-1))\\ &=\prod\limits_{state\subseteq S}2^{\text{cnt}_{state}}=2^{\sum_{state\subseteq S}\text{cnt}_{state}} \end{aligned} \]

對於 \(\sum_{state\subseteq S}\text{cnt}_{state}\)

,是可以用所謂的 SoSDP\(O(m2^m)\) 的時間內求出的,而 \(\sum_{state\subseteq S}\text{cnt}_{state}\) 的上界其實就是 \(n\) ,所以可以 \(O(n)\) 預處理出 \(2\) 的冪。總複雜度 \(O(m2^m+n)\)

總結

日常被容斥腳踩。