转置原理

· · 个人记录

n 个数,构成可重集 A,大小 [0,2^m-1]

对于每个 x\in [0,2^m-1] 求所有异或和为 xA 的子集 B 的贡献和,定义贡献为 a_{|B|}a 是输入的数组(原题中 a_i=\binom{2i}{B})。

n\le 10^6,m\le 20

FWT 后,易得要解决如下问题:

这一看就很转置原理,转一下

这是容易的,设 t=1+x,先求出 F(t)=\sum a_t(2-t)^{n-i}t^i

\sum a_t(2-t)^{n-i}t^i=\sum a_it^i\sum_{0\le j\le n-i}2^j(-1)^{n-i-j}t^{n-i-j}\binom{n-i}j =\sum_i a_i\sum_{0\le j\le n-i}2^j(-1)^{n-i-j}t^{n-j}\binom{n-i}j =\sum_j t^j 2^{n-j}\sum_i a_i(-1)^{j-i}\binom{n-i}{n-j} =\sum_j t^j \dfrac{2^{n-j}}{(n-j)!}\sum_i (n-i)!a_i\dfrac{(-1)^{j-i}}{(j-i)!}

是先点乘上 (n-i)!,卷积上某个多项式,再点乘上 2^{n-i}/(n-i)!

第二步,从 F(t) 变成 F(x)

\sum a_i(1+x)^i=\sum a_i\sum_{j\le i}\binom ijx^j =\sum_j x^j\sum_{i}a_i\binom{i}{j} =\sum_j x^j/j!\sum a_ii!/((i-j)!)

也是类似形式:先点乘 i!,再差卷积上 x^i/i!,再点乘 1/j!

综上,我们得到原题解法:

复杂度 O(n\log n+2^mm)。常数非常小。