现在小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", 然后接下来的n行m 列输出ci1, ci2, ... , cim (0 ≤ cij ≤ 2·109) — 即符合条件的矩阵。
如果有多个矩阵符合条件,输出任意一个。
Examples
2 3
2 9
5 3 13
YES
3 4 5
6 7 8
3 3
1 7 6
2 15 12
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(" "); } } }