Luogu3164[CQOI2014]和谐矩阵
题面:洛谷
解析
没啥好说的,列出异或方程组高斯消元即可(话说异或方程组和线性基长得好像啊)。
代码
// luogu-judger-enable-o2
#include<cstdio>
#include<bitset>
#define pos(i,j) ((i-1)*m+j)
#define N 1605
using namespace std;
int n,m,A,vi,vj,x[N];
int mx[5]={-1,0,1,0,0},my[5]={0,1,0,-1,0};
bitset<N> a[N];
#define gc() getchar()
inline int In(){
char c=gc(); int x=0,ft=1;
for(;c<'0'||c>='9';c=gc()) if(c=='-') ft=-1;
for(;c>='0'&&c<='9';c=gc()) x=x*10+c-'0';
return x*ft;
}
int main(){
n=In(); m=In(); A=n*m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
for(int k=0;k<5;++k){
vi=i+mx[k],vj=j+my[k];
if(vi<1||vi>n) continue;
if(vj<1||vj>m) continue;
a[pos(i,j)][pos(vi,vj)]=1;
}
}
for(int i=1;i<=A;++i){
if(!a[i][i]) for(int j=i+1;j<=A;++j)
if(a[j][i]){ swap(a[i],a[j]); break; }
for(int j=i+1;j<=A;++j) if(a[j][i]) a[j]^=a[i];
}
for(int i=A;i;--i){
x[i]=a[i][A+1];
for(int j=A;j>i;--j) if(a[i][j]) x[i]^=x[j];
if(!a[i][i]) x[i]=1;
}
for(int i=1;i<=A;++i) printf("%d%c",x[i],(i%m==0)?'
':' ');
return 0;
}