LOJ #6622. 「THUPC 2019」找樹 / findtree(矩陣樹定理+FWT+FMT)

找樹 題解
首先把這道題轉化爲計數題,即對於 i[0,2W1]i\in [0, 2^W-1],統計權值爲 ii 的樹有多少種,答案就是最大的方案數非 00ii

接下來考慮怎麼計數。生成樹計數顯然是基爾霍夫矩陣,但同時考慮權值就很麻煩了。但是注意到,如果所有操作都是異或,那我們可以將矩陣中的每個權值集合進行 FWT,而 FWT 後數組(集合冪級數)中的每一位都獨立了,因此可以分每一位分別計算基爾霍夫矩陣去掉一行一列後的行列式,把行列式的答案組成一個新的數組(集合冪級數),將它 IFWT 後即可得到每一個權值對應的樹的方案數。而如果所有操作都是與或者或,都可以進行 FMT 來轉化成每一位的問題,從而這樣解決。

注意到 FWT 的本質是每一個二進制位分別 FFT(長度爲 2 的 FFT,變成 a[0] + a[1] 和 a[0] - a[1]),FMT 的本質是每一個二進制位分別前綴和,那我們可以將這兩種算法結合起來。如果某一位的操作符是異或,那麼我們就將這一位進行 FFT;如果某一位的操作符是與(或),就將這一位求後(前)綴和。這樣就轉化爲按(數組裏的)位獨立的問題了,從而可以按照上面的方法分別計算行列式,最後再拼起來,按照這樣的規則逆變換回去即可。

注意到我們只需要判斷 0 和非 0,取幾個質數在模意義下計算行列式即可。複雜度 O((n+W)n22W)O((n+W)n^2 2^W )

正如上面官方題解所說的
FWT是nn維長度爲22的DFT,根據卷積定理,那麼顯然可以只對某一位DFT而不影響別的位。
FMT是nn維前綴和,這個東西顯然也可以只對某一位前綴和FMT而不影響別的位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章