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
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 }