-----------今天是被打爆的一天,T3就是用正解做的,但是好像zz了,只得了30分。-----------------
---------------- T1由于没判不合法的情况,也只有15分---------------------
---------------------果然是一个拿不到noip一等奖的人----------------------------
----------------------------毕竟noip都准备改名了?-------------------------
A:破碎的矩阵。
题意:给出N,M,表示有N*M的矩阵,然后给定每一行的异或和,每一列的异或和,求方案数。
思路:如果合法,方案数是pow(2,(N-1)*(M-1)),这个很好想,因为你确定了一个N*M的左上方(N-1)*(M-1)的矩阵后,最后一行一列可以反推,是唯一的。 不合法的情况是,异或和不为0;
#include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=2000010; int ans,N,M,Mod; ll x,a[maxn],b[maxn]; int qpow(int base,int num) { int res=1; while(num){ if(num&1) res=1LL*res*base%Mod; num>>=1; base=1LL*base*base%Mod; }return res; } void solve(int t) { int res=qpow(qpow(qpow(2,N-1),M-1),t); ans=1LL*res%Mod%Mod; } int main() { int T; scanf("%d",&T); while(T--){ ll xxx=0; scanf("%d%d%lld%d",&N,&M,&x,&Mod); rep(i,1,N) scanf("%lld",&a[i]),xxx^=a[i]; rep(i,1,M) scanf("%lld",&b[i]),xxx^=b[i]; if(xxx) puts("0"); else { int t=0; rep(i,0,60) if(x&(1LL<<i)) t++; solve(t); printf("%d\n",ans); } } return 0; }