D

传送门

现在小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
");
        for(int i = 1; i <= n; ++i) //打印矩阵
        {
            for(int j = 1; j <= m; ++j)
                printf("%d ", mp[i][j]);
            printf("
");
        }
    }
    
}
原文地址:https://www.cnblogs.com/lipu123/p/13992058.html