大概在做CC月賽的時候看到了這樣一道題:https://www.codechef.com/OCT17/problems/XORTREEH
題意是要你做一個%330301441的類似FWT的東西。定義數組A,B,C。定義一個操作A⊕B=C
C[i]=∑u∑vA[u]B[v] | u,v在k進制下不進位的和爲i 其中k=2,3,4,...,9,10
要你求一個
P=A⊕A⊕...⊕AX個A
當k=2時,這是一個異或規則的FWT。
接下來考慮k=2的情況。假設ABC長度爲2的冪次,用
Ai 表示最高位爲i的一段A。
那麼C0=A0⊕B0+A1⊕B1C1=A0⊕B1+A1⊕B0換一種表示方法:(C0,C1)=(A0⊕B0+A1⊕B1,A0⊕B1+A1⊕B0)
然後就在這裏卡住了。。
然後去網上搜FWT,又聽某dalao講了,大概知道了一些思路。
構造一個trans(A)=(trans(A0+A1),trans(A0−A1)) ,以及逆變換trans′(A)=(trans′(A0+A12),trans′(A0−A12)) 。
然後有
trans(C)=trans(A)×trans(B)
這裏的
A×B=C 代表
C[i]=A[i]B[i] 。
所以C=A⊕B=trans′(trans(C))=trans′(trans(A)×trans(B))
然後如果是多個相乘就是
D=A⊕B⊕C=trans′(trans(A)×trans(B)×trans(C))
這裏的trans 和trans′ 操作都可以在O(nlogn) 的時間內完成,所以總複雜度爲O(nlogn) 。
然後考慮k更大的情況,根據剛纔的方法,我們需要一個能夠在較低複雜度內實現的transk 和他的逆變換trans′k 。
進行一些枚舉,可以構造trans(A)=(trans(A0+A1+A2),trans(A0+wA1+w2A2),trans(A0+w2A1+w4A2)) 。其中w3=1 。
這時發現這個模數很牛逼啊,他保證了我存在w 使wk=1 。
然後推廣一波,好像很棒啊!複雜度大概是O(knlogkn) ?