题意
见链接: Matrix Equation
就是给你两个n*n的01矩阵A,B,问你有几个01矩阵C满足A叉乘C=A点乘C
分析
见手写的叭
具体见: 聚聚的博客
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define dec(i,x,y) for(int i=x;i>=y;i--)
const int N =210;
const int mod=998244353;
int a[N][N],A[N][N],B[N][N];
int n;
int guass()
{
int r=1,c;
rep(c,1,n)
{
int t=r;
if(!a[t][c])
rep(i,r+1,n) if(a[i][c]) { t = i ; break ; }
if(!a[t][c]) continue;
swap(a[t],a[r]);
rep(i,r+1,n)
dec(j,n,c) if(a[i][c]) a[i][j]=a[r][j]^a[i][j];
r++;
}
return r-1;
}
int qmi(int a,int k)
{
int res=1;
while(k)
{
if(k&1) res=1ll*res*a%mod;
k>>=1;
a=1ll*a*a%mod;
}
return res;
}
int main()
{
int ans=0;
read(n);
rep(i,1,n) rep(j,1,n) read(A[i][j]);
rep(i,1,n) rep(j,1,n) read(B[i][j]);
rep(k,1,n)
{
rep(i,1,n)
{
rep(j,1,n)
a[i][j]=A[i][j];
if(B[i][k]) a[i][i]=a[i][i]^1;//这里就是手写里的地方,特定标注一下
}
ans+=n-guass(); //高斯消元求此时自由元的个数
}
cout<<qmi(2,ans)<<endl;//ans是自由元的个数,因为只能取0 1所以就是2的幂次方答案
}