3503: [Cqoi2014]和谐矩阵

题目链接

题目大意:我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本
身,及他上下左右的4个元素(如果存在),输出一个n*m的和谐矩阵

题解:可以直接暴力列出n*m个方程,可以过

设(x,y)为某个位置的取值(出界视为0)
则有(x,y)^(x-1,y)^(x+1,y)^(x,y-1)^(x,y+1)=0,即(x^y)=(x-1,y-1)^(x,y-1)^(x+1,y-1)^(x,y-2)

显然确定第一行后整个矩阵就确定了……

而第一行的元素取值合理,当且仅当地推出第m+1行的元素都为0(不全0则第m行不合法)

设第一行为未知数,递推得到第m+1行上的每个点与第一行中每个点的关系,然后高斯消元

全0解显然可行,可以把自由元视为1以避免全0解(保证有解)

我的收获:2333

#include<iostream>  
#include<cstdio>  
#include<cstdlib>  
#include<cmath>  
#include<cstring>  
#include<algorithm>  
#define F(i,j,n) for(int i=j;i<=n;i++)  
#define D(i,j,n) for(int i=j;i>=n;i--)  
#define ll long long  
using namespace std;  
int n,m;  
ll a[50][50],b[50][50],c[50][50];  
inline int read()  
{  
    int x=0,f=1;char ch=getchar();  
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}  
    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}  
    return x*f;  
}  
inline void gauss()  
{  
    F(i,1,m)  
    {  
        int t=i;  
        while (t<=m&&!a[t][i]) t++;  
        if (t>m) continue;  
        F(j,1,m) swap(a[i][j],a[t][j]);  
        F(j,i+1,m) if (a[j][i]) F(k,i,m) a[j][k]^=a[i][k];  
    }  
    D(i,m,1)  
    {  
        c[1][i]=a[i][i]?a[i][m+1]:1;  
        if (c[1][i]) F(j,1,i-1) if (a[j][i]) a[j][m+1]^=1;  
    }  
}  
int main()  
{  
    n=read();m=read();  
    F(i,1,m) b[1][i]=(ll)1<<(i-1);  
    F(i,2,n+1) F(j,1,m) b[i][j]=b[i-1][j-1]^b[i-1][j]^b[i-1][j+1]^b[i-2][j];  
    F(i,1,m) F(j,1,m) a[i][j]=(b[n+1][i]>>(j-1))&1;  
    gauss();  
    F(i,2,n) F(j,1,m) c[i][j]=c[i-1][j-1]^c[i-1][j]^c[i-1][j+1]^c[i-2][j];  
    F(i,1,n)  
    {  
        F(j,1,m-1) printf("%d ",c[i][j]);  
        printf("%d\n",c[i][m]);  
    }  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值