Playing games

qq_43520313發表於2020-10-01

題目:
https://ac.nowcoder.com/acm/contest/295/H

有n個數,選出儘量多的數使得異或和為 0 0 0
1 ≤ n ≤ 500000 , 0 ≤ a i ≤ 500000 1\le n\le 500000,0\le a_i\le 500000 1n500000,0ai500000
思路:
問題等價於選出儘量少的數使得異或和為全部數的異或和 v a l val val。根據線性基思想可以推得整個集合的異或集合可以被不超過 19 19 19個數的異或集合表示.因此答案也不超過 19 19 19。所以可以二分答案。
那麼如何判斷選 m i d mid mid個數能否異或成 v a l val val,可以用生成函式 A = ∑ i = 0 500000 a i x i A=\sum_{i=0}^{500000}a_ix^i A=i=0500000aixi a i = 1 a_i=1 ai=1表示這個數存在,為 0 0 0表示不存在, A k A^k Ak就表示選 k k k個,只不過這裡是多項式的異或,用 F W T FWT FWT,而且算 B = A k B=A^k B=Ak,可以直接算 F W T ( B ) = F W T ( A ) k FWT(B)=FWT(A)^k FWT(B)=FWT(A)k,這樣只要把 A A A變成 F W T ( A ) FWT(A) FWT(A),然後對每一位算 k k k次冪,再把 F W T ( B ) FWT(B) FWT(B)變成 B B B就行,類似點值表示法。
還要注意一點,這樣會選重複,所以沒法直接判斷能否剛好選 m i d mid mid個數,但是重複的異或會抵消,相當於選的個數少於mid,因為是二分判斷,所以退而求其次,變成判斷能否用少於 m i d mid mid個數,那麼這樣生成函式 a 0 = 1 a_0=1 a0=1,代表可以不選。

總結:
異或的卷積形式和加得到的卷積類似,也可以用生成函式。

相關文章