bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3503
b[i][j] 表示i对j是否有影响
高斯消元解异或方程组
bitset优化
#include<cstdio> #include<bitset> using namespace std; bitset<1610>b[1610]; int x[5]={0,-1,0,1,0}; int y[5]={0,0,1,0,-1}; int n,m,t,ans[1610]; int turn(int i,int j) { return (i-1)*m+j-1; } void gauss() { int j; for(int i=0;i<t;i++) { j=i; while(j<t && !b[j][i]) j++; if(j==t) continue; swap(b[j],b[i]); for(int k=i+1;k<t;k++) if(b[k][i]) b[k]^=b[i]; } for(int i=t-1;i>=0;i--) if(!b[i][i]) ans[i]=1; else for(int j=i+1;j<t;j++) if(b[i][j]) ans[i]^=ans[j]; } int main() { scanf("%d%d",&n,&m); t=n*m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<5;k++) if(i+x[k] && i+x[k]<=n && j+y[k] && j+y[k]<=m) b[turn(i,j)][turn(i+x[k],j+y[k])]=1; gauss(); int z; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%d ",ans[turn(i,j)]); printf("\n"); } }
3503: [Cqoi2014]和谐矩阵
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1149 Solved: 540
[Submit][Status][Discuss]
Description
我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本
身,及他上下左右的4个元素(如果存在)。
给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意:所有元素为0的矩阵是不允许的。
Input
输入一行,包含两个空格分隔的整数m和n,分别表示矩阵的行数和列数。
Output
输出包含m行,每行n个空格分隔整数(0或1),为所求矩阵。测试数据保证有解。
Sample Input
4 4
Sample Output
0 1 0 0
1 1 1 0
0 0 0 1
1 1 0 1
数据范围
1 <=m, n <=40
1 1 1 0
0 0 0 1
1 1 0 1
数据范围
1 <=m, n <=40