D. Vasya And The Matrix------Educational Codeforces Round 48 (Rated for Div. 2)
D. Vasya And The Matrix
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the matrix that the teacher has constructed!
Vasya knows that the matrix consists of n rows and m columns. For each row, he knows the xor (bitwise excluding or) of the elements in this row. The sequence a1, a2, …, an denotes the xor of elements in rows with indices 1, 2, …, n, respectively. Similarly, for each column, he knows the xor of the elements in this column. The sequence b1, b2, …, bm denotes the xor of elements in columns with indices 1, 2, …, m, respectively.
Help Vasya! Find a matrix satisfying the given constraints or tell him that there is no suitable matrix.
Input
The first line contains two numbers n and m (2 ≤ n, m ≤ 100) — the dimensions of the matrix.
The second line contains n numbers a1, a2, …, an (0 ≤ ai ≤ 109), where ai is the xor of all elements in row i.
The third line contains m numbers b1, b2, …, bm (0 ≤ bi ≤ 109), where bi is the xor of all elements in column i.
Output
If there is no matrix satisfying the given constraints in the first line, output “NO”.
Otherwise, on the first line output “YES”, and then n rows of m numbers in each ci1, ci2, … , cim (0 ≤ cij ≤ 2·109) — the description of the matrix.
If there are several suitable matrices, it is allowed to print any of them.
Examples
inputCopy
2 3
2 9
5 3 13
outputCopy
YES
3 4 5
6 7 8
inputCopy
3 3
1 7 6
2 15 12
outputCopy
NO
题意:输入n,m,表示一个矩阵的行数和列数,然后给出矩阵的每行每列的异或值,问是否存在这样的矩阵,存在输出YES并随便输出一个符合条件的矩阵,否则输出NO
解题思路:先将a[1m-1]的异或值填到底num[0][1m-1]的位置,再将b[1n-1]行的异或值填到num[1n-1][0]的位置,然后将第一行的填上的数(也就是b[1n-1]值)再都异或起来得到ans,ans再异或a[0],将得到的数填在num[0][0],剩余没填位置都放0,这样就保证了除去a[1n-1]和b[1m-1]合法。最后就是判断num[0n-1][0]的所有值异或起来是否等于b[0],等于输出yes,并将num打印出来,不等于输出no
代码如下:(因为代码实现省去了num 数组,所以先进行判断是否存在数组,然后根据求出的第一行第一列的数和a[1m-1]和b[1n-1]直接打印出矩阵)
/*
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
◇◇◇◇◆◆◆◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◇
◇◇◇◇◆◇◆◆◇◇◇◇◆◆◆◆◆◆◇◇◇◆◆◆◆◆◆◇◇◆◆◆◇◆◆◆◇◇◆◆◆◆◆◇◇◇◇◆◆◆◆◆◇
◇◇◇◆◆◇◆◆◇◇◇◇◇◆◆◇◆◆◇◇◇◆◆◇◇◆◆◇◇◇◆◆◇◆◆◇◇◇◆◆◇◆◆◇◇◇◇◇◆◇◆◆◇
◇◇◇◆◆◆◆◆◆◇◇◇◇◆◇◇◇◆◇◇◇◆◇◇◇◆◆◇◇◇◆◆◇◆◆◇◇◇◆◆◆◆◆◆◇◇◇◇◆◇◇◇◇
◇◇◆◆◇◇◇◆◆◇◇◇◇◆◇◇◇◆◇◇◇◆◇◇◇◆◆◇◇◇◇◆◆◆◇◇◇◇◆◆◇◇◇◇◇◇◇◇◆◇◇◇◇
◇◇◆◆◇◇◇◆◆◇◇◇◇◆◇◇◇◆◇◇◇◆◆◇◇◆◆◇◇◇◇◆◆◆◇◇◇◇◆◆◇◇◆◇◇◇◇◇◆◇◇◇◇
◇◆◆◆◇◇◆◆◆◆◆◇◆◆◆◇◆◆◆◇◇◆◆◆◆◆◆◇◇◇◇◆◆◇◇◇◇◇◆◆◆◆◆◇◇◇◆◆◆◆◇◇◇
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
*/
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
const int maxn = 1e3+5;
int num[maxn][maxn];
int a[maxn];
int b[maxn];
int ans,ans1;
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)scanf("%d", &a[i]);
for (int i = 0; i < m; i++)scanf("%d", &b[i]);
for (int i = 1; i < m; i++)ans = ans ^ b[i]; //将第一行的填上的数(也就是b[1~n-1]值)再都异或起来得到ans
ans = ans ^ a[0]; //ans再异或a[0], 将得到的数填在num[0][0]
for (int i = 1; i < n; i++)ans1 = ans1 ^ a[i]; //将第一列的填上的数(也就是a[1~m-1]值)再都异或起来得到ans1
if ((ans^ans1) == b[0])printf("YES\n"); //判断num[0~n - 1][0]的所有值异或起来是否等于b[0],等于输出yes,不等于输出no
else {
printf("NO\n"); return 0;
}
printf("%d ", ans);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i == 0 & j == 0)continue;
else if (i == 0) {
printf("%d ", b[j]);
}
else if (j == 0) {
printf("%d ", a[i]);
}
else printf("0 ");
}
printf("\n");
}
}