[ZJOI2016]小星星
容斥是官方做法,不過用集合並卷積也可以推出同樣的dp式子。
樹形dp,令\(f_{x,i,S}\)表示以\(x\)爲根的子樹,\(x\)映射到\(i\),子樹全體映射到\(S\)的合法方案數。
考慮給當前的\(x\)添加一個以\(y\)爲根的子樹,令新的以\(x\)爲根的\(dp\)數組爲\(f'\),有:
枚舉合法的\(i,j\),餘下的就是一個看上去像子集卷積的東西。
然而最終只需要\(S\)爲全集的方案,如果\(A\)與\(B\)有交,那麼\(A\cup B\)必然小於新的\(x\)的子樹大小,最終不可能對答案產生貢獻。
於是考慮去掉\(A\cap B=\emptyset\)的限制,仍然保證答案的正確性,轉化爲集合並卷積:
於是令\(\hat f\)表示\(f\)對最後一維做莫比烏斯變換之後的結果,有:
初始狀態下\(f_{x,i,S}=[S=\{i\}]\),很容易得到莫比烏斯變換之後的結果。dp中不需要進行反演,保留莫比烏斯變換後的形式計算即可。
最後將根的全集方案數用莫比烏斯逆變換的公式算出來即可,複雜度也是\(O(n^32^n)\)。