题目:ARC197D
感觉问题出在 sort 那边。
#include<bits/stdc++.h>
#define ll long long
#define re register
#define fi first
#define se second
using namespace std;
inline ll read(){
ll res=0ll,f=1;
char c;
for(;(c=getchar())<'0'||c>'9';c=='-'?f=-f:0);
while(c>='0' && c<='9') res=(res<<1) + (res<<3) + c-'0',c=getchar();
return res*f;
}
inline ll Max(re ll x,re ll y){return x>y?x:y;}
inline ll Min(re ll x,re ll y){return x<y?x:y;}
inline void cmax(re auto &x,re auto y){x=Max(x,y);}
inline void cmin(re auto &x,re auto y){x=Min(x,y);}
/*-----------------*/
const ll mod=998244353;
inline ll add(re ll x,re ll y){return ((x+y)%mod+mod)%mod;}
inline ll mul(re ll x,re ll y){return (x*y%mod+mod)%mod;}
inline void Add(re ll &x,re ll y){x=add(x,y);}
inline void Mul(re ll &x,re ll y){x=mul(x,y);}
const int N=410;
int T,n;ll ans;
bitset<N> a[N];
inline ll f(re int x){
ll sum=1;
for(re int i=1;i<=x;i++) Mul(sum,i);
return sum;
}
inline ll solve(){
n=read();bool F=0;
for(re int i=1;i<=n;i++) a[i].reset();
for(re int i=1;i<=n;i++){
for(re int j=1;j<=n;j++){
int x=read();
if((i==1||j==1)&&!x) F=1;
x?(a[i].set(j),0):0;
}
}
for(re int i=1;i<=n;i++)
for(re int j=i+1;j<=n;j++)
if(((a[i]|a[j])==a[j]||
(a[i]|a[j])==a[i])
^a[i][j]) return 0;
if(F) return 0;
ans=1;
sort(a+2,a+n+1,
[n](re bitset<N> x,re bitset<N> y){
for(re int i=1;i<=n;i++){
if(x[i]!=y[i]) return !x[i];
}
return true;
}
);
int x=1;
for(re int i=3;i<=n;i++){
if(a[i]==a[i-1]) x++;
else Mul(ans,f(x)),x=1;
}
return mul(ans,f(x));
}
int main(){
T=read();
while(T--) printf("%lld\n",solve());
return 0;
}