ARC133F FWT 做法
看见网上题解都是“二维生成函数”,就来传一下这个做法(
问题可以转化为:\(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