题解:CF1016D Vasya And The Matrix
题目传送门
思路
首先如果行的所有异或和和列的所有异或和不同,就不存在该矩阵。
然后我们考虑一个无法严谨证明的思路。
就是我们把从
这样我们可以单独考虑每一行和每一列,行的异或和就是这一行的首元素,列的异或和就是这一列的首元素。即
但
这是
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=105;
int n,m,a[N],b[N],xor1,xor2,ans[N][N];
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",a+i),xor1^=a[i];
for(int i=1;i<=m;i++) scanf("%lld",b+i),xor2^=b[i];
if(xor1!=xor2) return printf("NO"),0;
for(int i=2;i<=n;i++) ans[i][1]=a[i];
for(int i=2;i<=m;i++) ans[1][i]=b[i];
xor1=b[1],xor2=a[1];
for(int i=2;i<=n;i++) xor1^=a[i];
for(int i=2;i<=m;i++) xor2^=b[i];
if(xor1!=xor2) return printf("NO"),0;
ans[1][1]=xor1;
printf("YES\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) printf("%lld ",ans[i][j]);
printf("\n");
}
return 0;
}
先别走,还有容易证明的方法。
我们将疑惑值逐位拉开,类似于二进制,每一位是
当行和列的
容易证明。撒花!