题解 P5159 【WD与矩阵】

ezoixx130

2018-12-31 12:06:01

Solution

### 题意: 题意很简单,就是问有多少个 $n$ 行 $m$ 列的 $01$ 矩阵的每行和每列的异或和均为 $0$。 ### 题解: 首先我们知道 $n-1$ 行 $m-1$ 列的 $01$ 矩阵的个数是 $2^{(n-1)(m-1)}$。 然后考虑对一个 $n-1$ 行 $m-1$ 列的 $01$ 矩阵求每行和每列的异或和,并且把异或和放到每行或每列的末尾。 这样我们就得到了一个 $n$ 行 $m$ 列的 $01$ 矩阵,特别地,第 $n$ 行 $m$ 列填上原本 $n-1$ 行 $m-1$ 列的 $01$ 矩阵中的所有数的异或和。 根据异或的性质不难得到,这个 $n$ 行 $m$ 列的 $01$ 矩阵的每行和每列的异或和均为 $0$。也就是说,这个矩阵符合题目要求。 上面我们证明了,每个 $n-1$ 行 $m-1$ 列的 $01$ 矩阵对应一个每行和每列的异或和均为 $0$ 的 $n$ 行 $m$ 列的 $01$ 矩阵。 那么有没有符合题意的 $n$ 行 $m$ 列的 $01$ 矩阵,它不被任何一个 $n-1$ 行 $m-1$ 列的 $01$ 矩阵所对应呢? 显然没有,因为每个符合题意的 $n$ 行 $m$ 列的 $01$ 矩阵,第 $n$ 行的每个数都等于它所在列的其它数的异或和,第 $m$ 列的每个数也都等于它所在行的其他数的异或和,所以它一定能被一个 $n-1$ 行 $m-1$ 列的 $01$ 矩阵所对应。 于是 $n-1$ 行 $m-1$ 列的 $01$ 矩阵与符合题意的 $n$ 行 $m$ 列的 $01$ 矩阵是一一对应的,所以个数相等,均为 $2^{(n-1)(m-1)}$。 快速幂求答案即可。 代码: ```cpp #include <bits/stdc++.h> using namespace std; #define mod 998244353 int qpow(int a,long long b) { int res=1; while(b) { if(b&1)res=(long long)res*a%mod; a=(long long)a*a%mod; b>>=1; } return res; } int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); printf("%d\n",qpow(2,(long long)(n-1)*(m-1))); } } ```