P5159 WD与矩阵

思路

奇怪的结论题
考虑增量构造,题目要求每行每列都有偶数个1,奇偶性只需要增减1就能够调整了,所以最后一列一行一定能调整前面n-1阶矩阵的值,所以前面可以任选
答案是(2^{(n-1)(m-1)})

当时怎么也考虑不清楚最后一行和最后一列交点的值,但是莽了一发发现对了。。
看了shadowice1984的题解之后才学会了证明
假设每行填的都是一个二进制数,最后一行填的必然是前面的异或和
因为每行的数都有偶数个二进制位,对于异或,有(bitcount(aoplus b)=bitcount(a)+bitcount(b)-2 imes bitcount(a & b))
所以最后一行必然有偶数个二进制位,必然合法
另外,长度为m的二进制数有偶数个二进制位的恰好有(2^{m-1})

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MOD = 998244353;
int n,m;
int pow(int a,int b){
    int ans=1;
    while(b){
        if(b&1)
            ans=(ans*a)%MOD;
        a=(a*a)%MOD;
        b>>=1;
    }
    return ans;
}
signed main(){
    int T;
    scanf("%lld",&T);
    while(T--){
        scanf("%lld %lld",&n,&m);
        printf("%lld
",pow(2,(n-1)*(m-1)));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dreagonm/p/10550269.html