codeforces D. Vasya And The Matrix(思維+矩陣+異或)
阿新 • • 發佈:2018-11-02
題意:給定一個n*m的矩陣(未知),以及每一行的各個元素的異或和,每一列的各個元素的異或和,求出一個符合的矩陣(任意即可)
題意:思維很重要,考慮特例的話,只需要考慮最後一行和最後一列,除了最後一行和最後一列,矩陣的其他元素為0,最後,矩陣第n行和第m列之間存在一個方程關係,來求出最後一個元素
轉載:
思路:對於這樣一個矩陣,我們只需要考慮最後一行和最後一列即可,其他都用0填充。然後,最後一行和最後一列也只需要考慮第n行第m個即可。對於樣例 行:2 ,9 列:5,3,13 .我們只需要構造出
0,0, 2
5,3,15
這樣一個矩陣即可,只需要考慮最後一個位置的數字即可,令最後一個數字為x的話,有
2^x=13, 5^3^x=9。很容易就可得出,x=13^2=9^5^3=15.
程式碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include <vector> #include<queue> #include <stack> #include <map> #define maxn 605005 #define INF 0x3f3f3f3f #define LL long long using namespace std; int n,m; int a[105],b[105]; int main() { cin>>n>>m; LL an,bm; an=bm=0; LL ax,by; for(int i=0;i<n;i++) { int t; cin>>t; a[i]=t; if(i!=n-1)//先求出第m列的前n-1個元素的異或 an=an^t; else ax=t; } for(int i=0;i<m;i++) { int t; cin>>t; b[i]=t; if(i!=m-1)//先求出第n行的前m-1個元素的異或 bm=bm^t; else by=t; } LL t1,t2; t1=an^by; t2=bm^ax; if(t1!=t2)//判斷是否成立 { cout << "NO\n"; } else { cout << "YES\n"; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(i<n-1&&j!=m-1) cout << 0 << ' '; else if(i!=n-1&&j==m-1) { cout << a[i]; } else if(j!=m-1) { cout << b[j] << ' '; } } if(i!=n-1) cout << endl; } cout << t1 << endl; } return 0; }