-----------今天是被打爆的一天,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;
}
View Code

相关文章:

  • 2021-09-07
  • 2022-02-16
  • 2021-07-18
  • 2021-06-20
  • 2021-08-21
  • 2022-12-23
猜你喜欢
  • 2021-10-24
  • 2021-10-22
  • 2022-12-23
  • 2021-12-28
  • 2021-12-06
  • 2022-12-23
相关资源
相似解决方案