CF662C-Binary-Table
题意
\(n\times m\) 的 \(01\) 数组,可以任意翻转多次行与列,求最少的 \(1\) 数。
\(n\le 20,m\le 10^5\)
思路
我们发现,如果直接枚举行与列是不行的,但是 \(n\le 20\) 又提示我们可以枚举行的翻转情况然后考虑列如何翻转。考虑一个列的状态如果是 \(s\),行的翻转是 \(x\),那么新的行状态就是 \(s \oplus x\)(异或)。那么,我们维护一下 \(s\) 的出现次数 \(a\),\(b_x\) 表示 \(x\) 中 \(0\) 与 \(1\) 出现最少的个数,则答案为
\[\sum_{i=0}^{2^n-1} a_s b_{s\oplus x}
\]
那么,如果我们考虑枚举 \(x\),则上式变成了
\[f_x=\sum_{j\oplus k=x}a_jb_k
\]
变成了标准的 fwt 形式,时间复杂度 \(\mathcal{O}(n2^n)\)。

浙公网安备 33010602011771号