您的位置:首页 > 其它

bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)

2018-01-03 16:11 417 查看
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 Judge
Submit: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: