CF662C Binary Table

给定一个 n×m01 矩阵,现在可以无限次对某一行或一列的每个数字取反,求最少的 1 的个数。
n20 , m105

Solution

考虑 n20,可以考虑把每一列压成一个二进制数字,然后 220 枚举翻转哪些行。

对于一个枚举的行的翻转状态 S,令某一列原本的状态为 pif(x)x 二进制下 1 的个数,那么翻转 S 中的行后,这一列状态会变成 piS。这一列的 1 的个数最少是 min(f(piS),nf(piS))(可以选择是否翻转这一列)。

a[x]x 这种状态在矩阵中出现的次数,b[x]min(f(x),nf(x))。则对于一个状态 S,有:

ans[S]=ja[j]×b[Sj]

然后就可以写成:

ans[i]=jk=ia[j]×b[k]

这是个 FWT 的形式,直接上就完事了。
复杂度 O(2n×log 2n)=O(2n×n)

标签: 位运算, FWT

添加新评论