找樹 題解
首先把這道題轉化爲計數題,即對於 ,統計權值爲 的樹有多少種,答案就是最大的方案數非 的 。
接下來考慮怎麼計數。生成樹計數顯然是基爾霍夫矩陣,但同時考慮權值就很麻煩了。但是注意到,如果所有操作都是異或,那我們可以將矩陣中的每個權值集合進行 FWT,而 FWT 後數組(集合冪級數)中的每一位都獨立了,因此可以分每一位分別計算基爾霍夫矩陣去掉一行一列後的行列式,把行列式的答案組成一個新的數組(集合冪級數),將它 IFWT 後即可得到每一個權值對應的樹的方案數。而如果所有操作都是與或者或,都可以進行 FMT 來轉化成每一位的問題,從而這樣解決。
注意到 FWT 的本質是每一個二進制位分別 FFT(長度爲 2 的 FFT,變成 a[0] + a[1] 和 a[0] - a[1]),FMT 的本質是每一個二進制位分別前綴和,那我們可以將這兩種算法結合起來。如果某一位的操作符是異或,那麼我們就將這一位進行 FFT;如果某一位的操作符是與(或),就將這一位求後(前)綴和。這樣就轉化爲按(數組裏的)位獨立的問題了,從而可以按照上面的方法分別計算行列式,最後再拼起來,按照這樣的規則逆變換回去即可。
注意到我們只需要判斷 0 和非 0,取幾個質數在模意義下計算行列式即可。複雜度 。
正如上面官方題解所說的
FWT是維長度爲的DFT,根據卷積定理,那麼顯然可以只對某一位DFT而不影響別的位。
FMT是維前綴和,這個東西顯然也可以只對某一位前綴和FMT而不影響別的位。