快速沃尔什变换——FWT学习小记

用途

  • FWT主要解决这样的问题,给出A(x),B(x),求 Ck=ij=kAiBj C k = ∑ i ⊗ j = k A i B j ,其中 表示and(按位与)/or(按位或)/xor(按位异或)运算中的一种。

定义

  • 首先,A(x)可以表示成一个n维向量 (a0,a1,...,an1) ( a 0 , a 1 , . . . , a n − 1 )
  • 定义向量间的加法为按位加,即: A(x)+B(x)=(a0+b0,a1+b1,...,an1+bn1) A ( x ) + B ( x ) = ( a 0 + b 0 , a 1 + b 1 , . . . , a n − 1 + b n − 1 )
  • 乘法亦为按位乘: A(x)B(x)=(a0b0,a1b1,...,an1bn1) A ( x ) B ( x ) = ( a 0 b 0 , a 1 b 1 , . . . , a n − 1 b n − 1 )
  • A(x)B(x)=C(x) A ( x ) ⊗ B ( x ) = C ( x ) ,C(x)即我们要求的n维向量。
  • 不妨将n扩大为某个2的幂次,这样便方便定义:
    A0(x)=(a0,a1,...,an/21),A1(x)=(an/2,...,an2,an1) A 0 ( x ) = ( a 0 , a 1 , . . . , a n / 2 − 1 ) , A 1 ( x ) = ( a n / 2 , . . . , a n − 2 , a n − 1 )

变换与逆变换

  • 设若我们构造了一个变换tf(tf也是一个n维向量),满足当n=1时 tf(A)=a0 t f ( A ) = a 0 ,并且 tf(A)tf(B)=tf(C) t f ( A ) t f ( B ) = t f ( C ) ,且可在较短时间内进行变换tf及其逆变换utf,那么我们便可以搞事了。
  • 并且,这个变换确实是存在的,不知道哪个大犇想出来的。
  • 虽说不知道怎么想出来的,但证还是会证的,可以使用数学归纳法。
XOR

tf(A)=(tf(A0)+tf(A1),tf(A0)tf(A1)) t f ( A ) = ( t f ( A 0 ) + t f ( A 1 ) , t f ( A 0 ) − t f ( A 1 ) )
utf(A)=(utf(A0+A1)2,utf(A0A1)2) u t f ( A ) = ( u t f ( A 0 + A 1 ) 2 , u t f ( A 0 − A 1 ) 2 )

AND

tf(A)=(tf(A0)+tf(A1),tf(A1)) t f ( A ) = ( t f ( A 0 ) + t f ( A 1 ) , t f ( A 1 ) )
utf(A)=(utf(A0)utf(A1),utf(A1)) u t f ( A ) = ( u t f ( A 0 ) − u t f ( A 1 ) , u t f ( A 1 ) )

OR

tf(A)=(tf(A0),tf(A1)+tf(A0)) t f ( A ) = ( t f ( A 0 ) , t f ( A 1 ) + t f ( A 0 ) )
utf(A)=(utf(A0),utf(A1)utf(A0)) u t f ( A ) = ( u t f ( A 0 ) , u t f ( A 1 ) − u t f ( A 0 ) )

算法流程

  • 至此,我们获悉了变换tf与逆变换utf的求法。
  • 那么,我们可以先求出tf(A),再求出tf(B)。tf(A)的求法可以递归分治下去,递归到n=1的那一层就直接返回 ax a x 。时间复杂度是 O(nlog2n) O ( n l o g 2 n ) 的。
  • 求完之后,两者相乘(按位乘)即为tf(C)。那么,直接套用逆变换, utf(tf(C))=C u t f ( t f ( C ) ) = C 。至于utf的计算,同样也是分治解决。

例题

Codeforces 662C Binary Table

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值