cf1392 D. 505


题意:

给出一个 \(n \times m\) 的 01 矩阵,如果每个边长偶数的正方形子矩阵内 1 的个数都为奇数,则这是一个“好的”矩阵。如果能把矩阵改成“好的”,问最少改多少个位置

思路:

n和m都大于等于4就没答案,否则暴力枚举。

怎么枚举呢?n和m至少有一个小于4,状压dp就好了

const signed N = 1e6 + 3;
int n, m, a[N];

bool ok(int x) {
    for(int i = 1; i < m; i++) //只跟奇偶有关,所以异或一下
        if(!((x>>i&1)^(x>>(i-1)&1)))
            return 0;
    return 1;
}

signed main() {
    iofast;
    cin >> n >> m;
    if(n >= 4 && m >= 4) return cout << -1, 0;

    //把char[][]改成int[]
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++) {
            char c; cin >> c; if(c == '1')
                (n >= m ? a[i] |= (1<> f((1<(n,INF));
    for(int i = 0; i < (1<