D - Vasya And The Matrix (数论异或)

传送门

现在小A正在参加一场数学考试。 为了赢得高分,小A想要猜出卷子里的矩阵!

小A只知道这个矩阵有n 行和m 列.。每一行, 他知道所有元素的异或之值。序列a1, a2, ..., an 分别代表第 1, 2, ..., n行所有元素的异或值. 同样的, 对每一列, 他也知道每一列所有元素的异或值。 序列b1, b2, ..., bm 分别代表第1, 2, ..., m列所有元素的异或值。

帮助小A找到一个符合条件的矩阵,或告诉他不存在这样的矩阵。

Input

第一行为两个整数n 和 m (2 ≤ n, m ≤ 100) — 矩阵的行数和列数。

第二行为n 个整数 a1, a2, ..., an (0 ≤ ai ≤ 109), 其中 ai 是每一行所有元素的异或值 i

第三行有m 个整数 b1, b2, ..., bm (0 ≤ bi ≤ 109), 其中 bi是每一列所有元素的异或值 i

Output

如果没有符合条件的矩阵,输出 "NO"(不加引号)。

否则, 第一行输出 "YES", 然后接下来的nm 列输出ci1, ci2, ... , cim (0 ≤ cij ≤ 2·109) — 即符合条件的矩阵。

如果有多个矩阵符合条件,输出任意一个。

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

Sponsor

 

 

题目大意:

就是说给你每一行的异或值和每一列的异或值,让你构造出这个矩阵的

首先你得知道一些关于异或的知识

就是x^a = b  <==> x^b = a

令suma=a[1]^a[2]^a[3]------^a[n]

sumb=b[1]^b[2]^b[3]------^b[m]

a[1]^a[2]^a[3] ... ^a[n-1] = a[n]^suma

b[1]^b[2]^b[3] ... ^b[m-1] = = b[m]^sumb

 

判断条件:

 

 

 

a1=x1^x4
a2=x2^x5
a3=x3^x6

b1=x1^x2^x3
b2=x4^x5^x6

a1^a2^a3=x1^x2^x3^x4^x5^x6
b1^b2=x1^x2^x3^x4^x5^x6
所以判断条件就是suma==sumb

 


所以你只需要求出x就行

x^a[1]^a[2]^a[3]^ ... ^a[n-1] = b[m]  且

x^b[1]^b[2]^b[3]^ ... ^ b[m-1] = a[n]

也就是 x^suma^a[n] = b[m], 

故 x = suma^a[n]^b[m].

 

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e3+100;
int a[maxn];
int b[maxn];
int mp[maxn][maxn];
/*
x^a = b  <==> x^b = a 
a[1]^a[2]^a[3] ... ^a[n-1] = a[n]^suma

b[1]^b[2]^b[3] ... ^b[m-1] = = b[m]^sumb

a1=x1^x4
a2=x2^x5
a3=x3^x6

b1=x1^x2^x3
b2=x4^x5^x6

a1^a2^a3=x1^x2^x3^x4^x5^x6
b1^b2=x1^x2^x3^x4^x5^x6
所以suma==sumb是判断条件 
*/
int main(){
    int n,m;
    cin>>n>>m;
    int suma=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        suma^=a[i];
    }
    int sumb=0;
    for(int j=1;j<=m;j++){
        cin>>b[j];
        sumb^=b[j];
    }
    if(suma!=sumb){
        cout<<"NO"<<endl;
    }
    else{
        int s=suma^a[n]^b[m];
        for(int i=1;i<=n;i++){
            mp[i][m]=a[i];
        }
        for(int i=1;i<=m;i++){
            mp[n][i]=b[i];
        } 
        mp[n][m]=s;
         printf("YES\n");
        for(int i = 1; i <= n; ++i) //打印矩阵
        {
            for(int j = 1; j <= m; ++j)
                printf("%d ", mp[i][j]);
            printf("\n");
        }
    }
    
}

 

posted @ 2020-11-17 00:10  哎呦哎(iui)  阅读(171)  评论(0编辑  收藏  举报