称一个由 \(0\) 和 \(1\) 组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本身,及他上下左右的 \(4\) 个元素。给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意所有元素为0的矩阵是不允许的。
Solution
即对于矩阵中的每一个点 \((x,y)\),需要求出一种方案使得
\[a[x][y] \oplus a[x+1][y] \oplus a[x-1][y] \oplus a[x][y+1] \oplus a[x][y-1] = 0
\]
于是我们列出了 \(nm\) 个方程,共有 \(nm\) 个未知量,高斯消元即可
#include
using namespace std;
const int N = 45;
const int dx[]={0,0,0,-1,1},dy[]={0,-1,1,0,0};
int n,m,id[N][N],ans[N*N];
bitset a[N*N];
void gauss() {
for(int i=1;i<=n*m;i++) {
for(int j=i;j<=n*m;j++) {
if(a[j][i]>0) {
swap(a[i],a[j]);
break;
}
}
if(!a[i][i]) ans[i]=1;
for(int j=i+1;j<=n*m;j++) {
if(a[j][i]) a[j]^=a[i];
}
}
for(int i=n*m;i>=1;--i) {
for(int j=i+1;j<=n*m;j++) {
ans[i]^=(ans[j]*a[i][j]);
}
}
}
signed main() {
cin>>n>>m;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
id[i][j]=(i-1)*m+j;
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
for(int k=0;k<=4;k++) {
int x=i+dx[k],y=j+dy[k];
if(x>=1 && y>=1 && x<=n && y<=m) {
a[id[i][j]][id[x][y]]=1;
}
}
}
}
gauss();
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cout<
}
cout<
}
}