思路
奇怪的结论题
考虑增量构造,题目要求每行每列都有偶数个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;
}