快速沃爾什變換FWT

大概在做CC月賽的時候看到了這樣一道題:https://www.codechef.com/OCT17/problems/XORTREEH
題意是要你做一個%330301441的類似FWT的東西。定義數組A,B,C。定義一個操作AB=C

C[i]=uvA[u]B[v]  |  u,vki  k=2,3,4,...,9,10

要你求一個P=AA...AXA
當k=2時,這是一個異或規則的FWT。
接下來考慮k=2的情況。假設ABC長度爲2的冪次,用Ai 表示最高位爲i的一段A。
C0=A0B0+A1B1C1=A0B1+A1B0(C0,C1)=(A0B0+A1B1,A0B1+A1B0)

然後就在這裏卡住了。。

然後去網上搜FWT,又聽某dalao講了,大概知道了一些思路。
構造一個trans(A)=(trans(A0+A1),trans(A0A1)) ,以及逆變換trans(A)=(trans(A0+A12),trans(A0A12))
然後有

trans(C)=trans(A)×trans(B)

這裏的A×B=C 代表C[i]=A[i]B[i]
C=AB=trans(trans(C))=trans(trans(A)×trans(B))
然後如果是多個相乘就是

D=ABC=trans(trans(A)×trans(B)×trans(C))

這裏的transtrans 操作都可以在O(nlogn) 的時間內完成,所以總複雜度爲O(nlogn)

然後考慮k更大的情況,根據剛纔的方法,我們需要一個能夠在較低複雜度內實現的transk 和他的逆變換transk

進行一些枚舉,可以構造trans(A)=(trans(A0+A1+A2),trans(A0+wA1+w2A2),trans(A0+w2A1+w4A2)) 。其中w3=1

這時發現這個模數很牛逼啊,他保證了我存在w 使wk=1

然後推廣一波,好像很棒啊!複雜度大概是O(knlogkn) ?

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