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 @   lipu123  阅读(281)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示