题目
思路
矩阵 A 与答案 C 每列乘积异或和互不干扰,故对每列分别列高斯方程求*元个数,等式右边化为 0
找到当前处理的未知数为 1 的行,交换,对之后该未知数为 1 的行整行异或,化为上三角求出解
代码
#include<bits/stdc++.h>
#define LL long long
#define mod 998244353
using namespace std;
const int N=209;
int n;
LL ans=1LL;
LL p[N];
bitset<N>a[N],b[N],c[N];
int Gauss()
{
int row=1;
for(int col=1;col<=n;col++)
{
int k=0;
for(int i=row;i<=n;i++)
if(c[i][col])
k=i;
if(!k) continue;
if(k!=row) swap(c[row],c[k]);
for(int i=row+1;i<=n;i++)
if(c[i][col])
c[i]=c[i]^c[row];
row++;
}
return row-1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;
cin>>x;
a[i][j]=x;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;
cin>>x;
b[i][j]=x;
}
p[0]=1LL;
for(int i=1;i<=200;i++)
p[i]=p[i-1]*2LL%mod;
for(int col=1;col<=n;col++)
{
for(int i=1;i<=n;i++)
{
c[i]=a[i];
c[i][i]=c[i][i]^b[i][col]; //等式右边化为0
}
ans=ans*p[n-Gauss()]%mod;
}
cout<<ans<<endl;
return 0;
}