【题解】CF662C Binary Table 作者: CXY07 时间: 2021-01-30 分类: 题解 CF662C Binary Table给定一个 n×m 的 01 矩阵,现在可以无限次对某一行或一列的每个数字取反,求最少的 1 的个数。n≤20 , m≤105Solution考虑 n≤20,可以考虑把每一列压成一个二进制数字,然后 220 枚举翻转哪些行。对于一个枚举的行的翻转状态 S,令某一列原本的状态为 pi,f(x) 为 x 二进制下 1 的个数,那么翻转 S 中的行后,这一列状态会变成 pi⊕S。这一列的 1 的个数最少是 min(f(pi⊕S),n−f(pi⊕S))(可以选择是否翻转这一列)。令 a[x] 为 x 这种状态在矩阵中出现的次数,b[x] 为 min(f(x),n−f(x))。则对于一个状态 S,有:ans[S]=∑ja[j]×b[S⊕j]然后就可以写成:ans[i]=∑j⊕k=ia[j]×b[k]这是个 FWT 的形式,直接上就完事了。复杂度 O(2n×log 2n)=O(2n×n) 标签: 位运算, FWT