和谐矩阵题解
没什么说的,
高斯消元解异或方程组,
板子要多打打,有点不熟,
\(bitset\)优化,\(O(n^{3}/64)\)
看起来是\(O(n^{2})\),不过不同行的\(bitset\)异或需要\(O(n)\)
#include<bits/stdc++.h>
using namespace std;
const int N=1606,dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int n,m,t,sx,sy,p,ans[N];
bitset<N> s[N];
int main(){
scanf("%d%d",&n,&m),p=n*m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
t=(i-1)*m+j,s[t][t]=1;
for(int k=0;k<4;++k){
sx=i+dx[k],sy=j+dy[k];
if(sx<1||sx>n||sy<1||sy>m) continue;
s[t][(sx-1)*m+sy]=1;
}
}
for(int i=1;i<=p;++i){
t=i;
while(t<=p&&!s[t][i]) ++t;
if(t>p){
s[i][p+1]=1;
for(int j=i+1;j<=p;++j) s[i][j]=0,s[j].flip(p+1);
continue;
}
swap(s[t],s[i]);
for(int j=i+1;j<=p;++j) if(s[j][i]) s[j]^=s[i];
}
for(int i=p;i>=1;--i){
ans[i]=s[i][p+1];
for(int j=i+1;j<=p;++j) if(s[i][j]) ans[i]^=ans[j];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j) printf("%d ",ans[(i-1)*m+j]);
printf("\n");
}
return 0;
}