Educational Codeforces Round 48 (Rated for Div. 2) D. Vasya And The Matrix(构造)

描述

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 a*1, *a*2, …, *a**n 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 b*1, *b*2, …, *b**m 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 a*1, *a*2, …, *a**n (0 ≤ a**i ≤ 109), where a**i is the xor of all elements in row i.

The third line contains m numbers b*1, *b*2, …, *b**m (0 ≤ b**i ≤ 109), where b**i 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 c**i*1, *c**i*2, … , *c**im (0 ≤ c**ij ≤ 2·109) — the description of the matrix.

If there are several suitable matrices, it is allowed to print any of them.

input

2 3
2 9
5 3 13

output

YES
3 4 5
6 7 8

input

3 3
1 7 6
2 15 12

output

NO

思路

给了一个矩阵的行数和列数,然后给出了每一行的异或和,然后给出了每一列的异或和,问你存不存在一个符合这些条件的矩阵,如果存在就输出YES并且输出这个矩阵,不存在就输出No

比如我们要构造一下这个矩阵(后面的是异或和):

2 92 100---->58
3 38 24 ---->61
6 72 32 ---->81
|  |  |
|  |  |
7  50 99

现在我们知道了这个矩阵的行和列的异或和.

因为异或有两个性质:

x^x=0
x^0=x

所以我们要使行可以成立,我们把每一行除了最后一个全部填0,每行最后一个填这一行的异或和,我们把每一列全部填0,当到最后一列时,就填这一列的异或和,就像这样:

0 0 58
0 0 61
7 50 (未知)

现在有一个未知的不知道应该怎么填,我们要满足最后一列的异或和为99时,这里就需要填58^61^99=100然后现在列满足条件了,但是行不一定满足,我们接着计算一下行,我们会发现7^50^100=81现在行也满足条件,所以我们已经可以构造出这样一个矩阵。那么如果不相等呢,没错,不不相等的时候就无法构造出这样一个矩阵,直接输出NO就行了

代码

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+20;
const int inf=0x3f3f3f3f;
int a[N],b[N];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)scanf("%d",&a[i]);
    for(int i=1; i<=m; i++)scanf("%d",&b[i]);
    int ans1=0;
    for(int i=1; i<n; i++)
        ans1^=a[i];
    int ans2=ans1^b[m];
    int ans=0;
    for(int i=1; i<m; i++)
        ans^=b[i];
    ans^=ans2;
    if(ans==a[n])
    {
        puts("YES");
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(i==n&&j==m)
                    printf("%d ",ans2);
                else if(i==n)
                    printf("%d ",b[j]);
                else if(j==m)
                    printf("%d ",a[i]);
                else
                    printf("0 ");
            }
            puts("");
        }
        puts("");
    }
    else
        puts("NO");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/riba2534/article/details/81409295