• bzoj3503: [Cqoi2014]和谐矩阵


    Description

    我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本
    身,及他上下左右的4个元素(如果存在)。
    给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意:所有元素为0的矩阵是不允许的。

    Input

    输入一行,包含两个空格分隔的整数m和n,分别表示矩阵的行数和列数。

    Output


    输出包含m行,每行n个空格分隔整数(0或1),为所求矩阵。测试数据保证有解。

    Sample Input

    4 4

    Sample Output

    0100
    1110
    0001
    1101

    数据范围
    1 <=m, n <=40
     
    xor方程组
    将第一行的数设为未知数xi,我们就可以推出其他行和xi的关系。
    然后我们递推出第m+1行,这一行必然为0
    然后接xor方程组即可
     
    code:
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define maxn 45
     7 using namespace std;
     8 typedef long long int64;
     9 char ch;
    10 int n,m;
    11 int64 c[maxn][maxn],a[maxn],b[maxn];
    12 int v[maxn][maxn],x[maxn];
    13 bool ok;
    14 void read(int &x){
    15     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
    16     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    17     if (ok) x=-x;
    18 }
    19 void gauss(){
    20     int i,j,k;
    21     for (i=1,k=1;i<=n;i++){
    22         for (j=k;j<=n&&!(a[j]&(1LL<<i));j++);
    23         if (j<=n){
    24             swap(a[k],a[j]);
    25             for (j=j+1;j<=n;j++) if (a[j]&(1LL<<i)) a[j]^=a[k],b[j]^=b[k];
    26             k++;
    27         }
    28         else{
    29             x[i]=1;
    30             for (j=k-1;j>=1;j--) if (a[j]&(1LL<<i)) a[j]^=(1LL<<i),b[j]^=1;
    31         }
    32     }
    33     for (k--,i=n;i>=1;i--)
    34         if (a[k]&(1LL<<i)){
    35             x[i]=b[k];
    36             for (j=k;j>=1;j--) if (a[j]&(1LL<<i)) a[j]^=(1LL<<i),b[j]^=x[i];
    37             k--;
    38         }
    39 }
    40 int main(){
    41     read(m),read(n);
    42     for (int i=1;i<=n;i++) c[1][i]=(1LL<<(n-i+1));
    43     for (int i=2;i<=m+1;i++)
    44         for (int j=1;j<=n;j++) c[i][j]=c[i-1][j-1]^c[i-1][j]^c[i-1][j+1]^c[i-2][j];
    45     for (int i=1;i<=n;i++) a[i]=c[m+1][i];
    46     gauss();
    47     for (int i=1;i<=n;i++) v[1][i]=x[i];
    48     for (int i=2;i<=m;i++)
    49         for (int j=1;j<=n;j++) v[i][j]=v[i-1][j-1]^v[i-1][j]^v[i-1][j+1]^v[i-2][j];
    50     for (int i=1;i<=m;i++,puts(""))
    51         for (int j=1;j<=n;j++) printf("%d ",v[i][j]);
    52     return 0;
    53 }
  • 相关阅读:
    solaris 10 root忘记密码的解决方法
    c程序设计--指针与数组
    photoshop之色阶的使用
    Handling Errors Exceptionally Well in C++ 在C++中良好地捕获意外的错误
    自动换行 wordbreak:breakall和wordwrap:breakword
    透明度
    position:fixed在IE6下的实现
    JavaScript教程:常用DOM操作方法,JavaScriptDOM基本操作
    30 个免费的 UI 工具箱
    去掉虚线框兼容所有浏览器
  • 原文地址:https://www.cnblogs.com/chenyushuo/p/4685182.html
Copyright © 2020-2023  润新知