【BZOJ 3503】 [Cqoi2014]和谐矩阵|高斯消元|xor方程组

来源:互联网 发布:上海软件开发 编辑:程序博客网 时间:2024/05/16 09:12

网上题解很多啦~~

很神啊~~

xor也可以gauss啊

我好弱啊~!

#include <cmath>#include <cstdio>#include <cstring>#include <iostream> #include <algorithm>using namespace std;#define LL long longconst int MAXN=42;LL init[MAXN][MAXN];int n,m,f[MAXN][MAXN],val[MAXN][MAXN];void gauss(){for(int i=1;i<=m;i++){bool ok=false;for(int j=i;j<=m;j++)if(f[j][i]==1){ok=true;if(j!=i)for(int k=i;k<=m;k++)swap(f[i][k],f[j][k]);break;}if(ok==false) continue;for(int j=i+1;j<=m;j++)if(f[j][i]==1)for(int k=i;k<=m;k++)f[j][k]^=f[i][k];}for(int i=m;i>=1;i--){if(f[i][i]==0){val[1][i]=1;continue ;}for(int j=i+1;j<=m;j++)val[1][i]^=f[i][j]&val[1][j];}}int main(){cin >>n >>m;for(int i=0;i<m;i++)init[1][i+1]=(1ll<<i);for(int i=2;i<=n+1;i++)for(int j=1;j<=m;j++)init[i][j]=init[i-1][j-1] ^ init[i-1][j] ^ init[i-1][j+1] ^ init[i-2][j];for(int i=1;i<=m;i++){LL tmp=init[n+1][i];for(int j=1;j<=m;j++){f[i][j]=tmp&1ll;tmp>>=1;}}gauss();for(int i=2;i<=n;i++)for(int j=1;j<=m;j++)val[i][j]=val[i-1][j-1] ^ val[i-1][j] ^ val[i-1][j+1] ^val[i-2][j];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)printf("%d ",(int)val[i][j]);printf("\n");}return 0;}


0 0