Luogu3164[CQOI2014]和谐矩阵

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)?'\n':' ');
    return 0;
}



posted @ 2019-03-13 21:56  pkh68  阅读(148)  评论(0编辑  收藏  举报