大概在做CC月赛的时候看到了这样一道题:https://www.codechef.com/OCT17/problems/XORTREEH
题意是要你做一个%330301441的类似FWT的东西。定义数组A,B,C。定义一个操作 A⊕B=C
然后去网上搜FWT,又听某dalao讲了,大概知道了一些思路。
构造一个 trans(A)=(trans(A0+A1),trans(A0−A1)) ,以及逆变换 trans′(A)=(trans′(A0+A12),trans′(A0−A12)) 。
然后有
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) ?