题目描述
有n个数组,第i个数组由个,个,个组成,在每个数组中选出一个数,然后xor起来等于t,求方案数。对全部的 输出答案。
分析
题目等价于询问将n个这样的数组作xor卷积的结果:位置为,位置为,位置为, 其余位置为0.
简化问题,先将所有 xor起来作为结果,然后,bi^=ai, ci^=ai
问题转化成n个这样的数组作xor卷积:0位置为,位置为,位置为, 其余位置为0.
为了得到这题正解,我们得明白FWT的推导过程。
FWT 推导
FWT需要解决的是这样一个xor卷积问题:
我们目标是寻找一个线性变换FWT,令满足
既然是线性变换,就可以表示成矩阵,使得
我们的目标可以表示成
将代入,
化简得,
也就是,
考虑的什么属性会是属性的乘积.
对于异或操作来说,异或前后1的个数的奇偶性不会改变,也就是说中1的个数加起来和中1的个数的奇偶性是一样的。
于是我们可以定义
每一项其实是二进制表示的集合,因此使用集合交符号与集合大小符号|S|
所以FWT就是