1. 程式人生 > >codeforces D. Vasya And The Matrix(思維+矩陣+異或)

codeforces D. Vasya And The Matrix(思維+矩陣+異或)

題意:給定一個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;
}