http://codeforces.com/contest/1016/problem/D
题意:
NxM的矩阵, 给你第1行到第n行的整行的异或和 , 以及第1列到第m列的整列上的异或和。问能否构造出这个矩阵
思路:
无论是从行的角度看, 还是列的角度看,他们描述的都是同一个矩阵, 因此如若矩阵合法,那么他们的异或和比必须为0, 相当于整个矩阵异或了两次。 可以判断是否合法之后,我们怎么构造呢?这里就需要积累了,小本本记下。 我们可以这样构造
0 0 0 a[1]
0 0 0 a[2]
b[1] b[2] b[3] x
怎么算x呢 , 假设行上的异或和为a0 (也等于列的异或和), 那么a0就表示整个矩阵的异或和,
则 a0 ^ a[3] 得到 a[1] ^ a[ 2 ] , 然后拿 b[4] ^ ( a[1] ^ a[ 2 ] )就得到t位置上的值了。异或大法好
代码:
#include<bits/stdc++.h>
#define MAXN 105
using namespace std;
int a[MAXN],b[MAXN];
int a0,b0;
int main()
{
int n,m,i,j;
scanf("%d %d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
a0^=a[i];
}
for(i=1; i<=m; i++)
{
scanf("%d",&b[i]);
b0^=b[i];
}
if(a0!=b0)
printf("NO\n");
else
{
printf("YES\n");
for(int i=1; i<=n-1; i++)
{
for(int j=1; j<=m-1; j++)
printf("0 ");
printf("%d\n",a[i]);
}
for(int j=1; j<=m-1; j++)
printf("%d ",b[j]);
printf("%d\n",b[m]^ a0^a[n]);
}
return 0;
}