https://vjudge.net/problem/CodeForces-1016D
题目大意:问你能否构造出一个
的矩阵,使得第
行元素的异或和等于
,第
列元素的异或和等于
,若能则输出矩阵每一个元素的值。
思路:其实这题巨水。首先很容易看出有解必须满足:
,然后考虑如何构造。首先前
行、
列的全部元素都搞成
,然后第
行的最后一个元素为
,第
列的最后一个元素为
,显然,除了
这个位置的元素对应两个值,其它位置的值都满足题意,现在只考虑这个位置:(1)仅考虑列,假设此处的值为
,显然要满足:
;(2)仅考虑行,假设此处的值为
,显然要满足:
。因为疑惑满足交换律,所以我们可以得到:
我们将它们异或起来,可以得到:
由此可得
,也就是说右下角这个值也可以唯一确定,所以构造是满足题意的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[105],b[105];
int main()
{
scanf("%d%d",&n,&m);
int ans=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]),ans^=a[i];
for(int i=0;i<m;i++)
scanf("%d",&b[i]),ans^=b[i];
if(ans)
printf("NO\n");
else
{
printf("YES\n");
ans=0;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<m-1;j++)
printf("0 ");
printf("%d\n",a[i]);
ans^=a[i];
}
for(int i=0;i<m-1;i++)
printf("%d ",b[i]);
ans^=b[m-1];
printf("%d\n",ans);
}
return 0;
}