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 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

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
 

题意:

用输入的m,n分别代表一个矩阵的长和宽,构造一个矩形需要满足如下条件:

m行按位异或和分别等于第二行的每个数

n列按位运算和分别等于第三行的每个数

先打个比方假如m=3,n=4,则可构造一个这样的矩阵

3 1 1 1

2 0 0 0

2 0 0 0 

矩阵为1的部分代表要填数的地方,0则表示该处填0,因为这题有很多种构造方法,而因为0异或任何数值都不变,所以可以让中间的值全部为0,1处则填a1-a[n-1], 2处则填b[1]-b[m-1],把b[1]-b[m-1]的异或和赋值给flag,再让flag^=a[0],把a[0]-a[m-1]的异或和赋值给flag1,再判断flag^flag1是否等于b[0],等于则有该矩形存在,否则就不存在

 

#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");
    }

}


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值