去年听GZMdalao讲FWT,第一句就是:构造这玩意的人是神 ( 经 病 ) _{(经病)} (经病)吧。
其实还好。。。。。。
FFT向我们提供了一个思路来解决卷积问题,那就是对于多项式(数组)构造一个(可逆)变换FFT(A),使得:
F F T ( A ) [ i ] ∗ F F T ( B ) [ i ] = F F T ( A ∘ B ) [ i ] FFT(A)[i] * FFT(B)[i] = FFT(A \circ B)[i] FFT(A)[i]∗FFT(B)[i]=FFT(A∘B)[i],其中 ∘ \circ ∘为卷积符号,然后我们就把问题转化为了如何构造变换FFT()使得变换速度可以承受。
然后上古dalao就构造: F F T ( A ) [ i ] = ∑ k = 0 n ( w n i ) k ∗ A [ k ] FFT(A)[i] = \sum_{k=0}^n (w_n^i)^k * A[k] FFT(A)[i]=k=0∑n(wni)k∗A[k]
易证满足 F F T ( A ) [ i ] ∗ F F T ( B ) [ i ] = F F T ( A ∗ B ) [ i ] FFT(A)[i] * FFT(B)[i] = FFT(A * B)[i] FFT(A)[i]∗FFT(B)[i]=FFT(A∗B)[i]
那么对于其他的卷积形式,我们可以通过构造变换来加速。
然后我们发现了一类方法,不过这类方法实际操作起来非常有难度,那么就像研究容斥模型和研究杜教筛一样,先找几个具体点的模型来研究总结规律和技巧,并使这个算法得到应用和拓展,然后。。。。。。你就可以美其名曰:“套路题。”,这种从一般到特殊的研究最终也就落得个“背板就行了”的下场。。。。。。
其中一个特殊模型就是位运算卷积,它的变换被业界称为FWT。
先是 o r or or
C [ i ] = ∑ u ∣ v = i A [ u ] ∗ B [ v ] C[i] = \sum_{u|v = i} A[u] * B[v] C[i]=u∣v=i∑A[u]∗B[v]
因为 ( u ∣ i ) ∣ ( v ∣ i ) = ( u ∣ v ) ∣ i (u|i)|(v|i)=(u|v)|i (u∣i)∣(v∣i)=(u∣v)∣i
所以 F W T ( A ) [ i ] = ∑ u ∣ i = i A [ u ] FWT(A)[i] = \sum_{u|i=i}A[u] FWT(A)[i]=∑u∣i=iA[u]
那么对于每一组 u , v , 且 u ∣ i = i , v ∣ i = i u,v,且u|i=i,v|i=i u,v,且u∣i=i,v∣i=i,有 ( u ∣ v ) ∣ i = i (u|v)|i=i (u∣v)∣i=i,则 A [ u