码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj3503: [Cqoi2014]和谐矩阵

时间:2015-07-29 11:45:54      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

bzoj3503: [Cqoi2014]和谐矩阵

标签:

原文地址:http://www.cnblogs.com/chenyushuo/p/4685182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!