牛客提高D3t1 破碎的矩阵

分析

我们发现如果行的异或和等于列的异或和那么对于n-1行m-1列的所有数的选择都是任意的

因为一定可以在它的行末/列末选一个合适的数是的整体满足

但是我们发现对于右下角那一个数是否满足存疑

我们设矩阵为

a1  a2  a3  a4

a5  a6  a7  a8

a9  a10 a11 a12

a13 a14 a15 a16

设行和列的异或值分别为X1 X2 X3 X4 Y1 Y2 Y3 Y4

设左上角3*3的矩阵的异或值为ALL

则:

a16 = X4 ^ (Y1 ^ Y2 ^ Y3 ^ ALL)

    =X4 ^ (X1 ^ X2 ^ X3 ^ X4 ^ Y4 ^ ALL)

    = Y4 ^ (X1 ^ X2 ^ X3 ^ ALL)

得证

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
int n,m,mod;
inline int pw(int x,int p){
    int res=1;
    while(p){
      if(p&1)res=res*x%mod;
      x=x*x%mod;
      p>>=1;
    }
    return res;
}
signed main(){
    int i,j,k,t,v;
    scanf("%lld",&t);
    while(t--){
      scanf("%lld%lld%lld%lld",&n,&m,&k,&mod);
      int ans=0,x=0,y=0;
      for(i=1;i<=n;i++){
        scanf("%lld",&v);
        x^=v;
      }
      for(i=1;i<=m;i++){
        scanf("%lld",&v);
        y^=v;
      }
      if(x!=y)puts("0");
        else {
          k++;
          k%=mod;
          printf("%lld\n",pw(pw(k,n-1),m-1));
        }
    }
    return 0;
}
posted @ 2019-08-24 19:22  水题收割者  阅读(453)  评论(0编辑  收藏  举报