思路是建出来矩阵之后异或消元变成一个行最简形矩阵,然后将自由元设为 1,将自由元更新每一行的主元的值。
#include<bits/stdc++.h>
using namespace std;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m;
bitset<1610> a[1610];
int ans[1610];
bool zyy[1610]; // 自由元
int wz[1610]; // 第一个 1
int main()
{
cin>>n>>m;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
for(int k=0; k<4; ++k)
{
int tx=i+dx[k],ty=j+dy[k];
if(1<=tx && tx<=n && 1<=ty && ty<=m) a[(i-1)*m+j][(tx-1)*m+ty]=1;
}
}
}
for(int pos=1,i=1; i<=n*m && pos<=n*m+1; ++pos)
{
int wwz=0;
for(int j=i; j<=n*m; ++j)
{
if(a[j][pos]) { wwz=j; break; }
}
if(!wwz) { zyy[pos]=1; continue; }
swap(a[i],a[wwz]);
wz[i]=pos;
for(int j=1; j<=n*m; ++j)
{
if(j!=i && a[j][pos]) a[j]^=a[i];
}
++i;
}
for(int i=1; i<=n*m; ++i)
{
for(int j=1; j<=n*m+1; ++j)
{
cout<<a[i][j];
}
cout<<'\n';
}
for(int i=1; i<=n*m; ++i)
{
if(zyy[i])
{
ans[i]=1;
for(int j=1; j<=n*m; ++j)
{
if(wz[j] && a[j][i]) ans[wz[j]]^=1;
}
}
}
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j) cout<<ans[(i-1)*m+j]<<' ';
cout<<'\n';
}
return 0;
}