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("
");
    }   
}

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
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8184287.html