ARC133F FWT 做法

发布时间 2023-07-13 18:52:23作者: Rainbow_qwq

看见网上题解都是“二维生成函数”,就来传一下这个做法(


问题可以转化为:\(n\) 枚硬币,每次随机翻一枚,求最后正面朝上硬币个数的期望。

把这个过程看作 XOR 卷积,并且需要卷积的两个数组有特性:在 popcount 相同的位置值相同。

这样只要对这种特殊的数组能做 fwt 就做完了。

于是现在要解决如下问题:

  • 数组中每个下标 popcount 相同的数的值是相同的,求出这个东西的 fwt xor 后的数组

\(G=\text{FWT}(F)\)\(f_k = \sum_{cnt(s)=k}F_s\)\(g_i = \sum_{cnt(s)=i}G_s\)

fwt xor 的式子是

\[G_{s} = \sum_{t} F_{t}(-1)^{cnt(t\&s)} \]

枚举多少二进制位相交得到

\[g_k = \sum_{i=0}^{n} f_i (1-x)^i(1+x)^{n-i}[x^k] \]

直接分治乘可以做到 \(O(n\log^2n)\)

还可以推一下:

\[\sum_{i=0}^{n} f_i (x-1)^i((x-1)+2)^{n-i} \]

\[\sum_{i=0}^{n} \sum_{j=0}^{n-i} f_i (x-1)^{i+j}2^{n-i-j}\binom{n-i}{j} \]

对于 \(k=i+j\) 求出

\[h_k = \sum_{i=0}^n f_i \binom{n-i}{k-i} \]

answer =

\[\sum_{k=0}^n h_k2^{n-k}(x-1)^k \]

于是做到了 \(O(n\log n)\)


另外,这种特殊 FWT 卷积无论是否进行转置做,最终式子是相同的。link