rt,另外测试点 #18#19#20 都显示程序错误地输出 0。
提前拜谢大佬orz。
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace pragmatic {
constexpr int N=105,mod=998244353;
int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; }
void _add(int &a,int b) { a=add(a,b); }
int mul(int a,int b) { return 1ll*a*b%mod; }
void _mul(int &a,int b) { a=mul(a,b); }
int t,k;
int n,m[N];
int u,v;
struct juzhen {
int n,m;
int x[N][N];
void clear() { memset(x,0,sizeof(x)); }
juzhen operator * (const juzhen b) const {
juzhen c={n,b.m};
c.clear();
rep(i,1,c.n) rep(j,1,c.m) {
rep(k,1,m) _add(c.x[i][j],mul(x[i][k],b.x[k][j]));
}
return c;
}
void write() {
rep(i,1,n) {
rep(j,1,m) pf("%d ",x[i][j]); pf("\n");
}
}
}a[N];
int f;
int ksm(int a,int b=mod-2) {
int s=1;
while(b) {
if(b&1) _mul(s,a);
_mul(a,a);
b>>=1;
}
return s;
}
void _swap(juzhen &a,int x,int y) {
f^=1;
rep(i,1,a.n) swap(a.x[x][i],a.x[y][i]);
}
void gauss(juzhen &a) {
rep(i,1,a.n) {
if(!a.x[i][i])
rep(j,i+1,a.n) {
if(a.x[j][i]) {
_swap(a,i,j);
break;
}
}
int inv=ksm(a.x[i][i]);
rep(j,i+1,a.n) {
if(!a.x[j][i]) continue;
int t=mul(inv,a.x[j][i]);
rep(k,i,a.n) _add(a.x[j][k],mod-mul(t,a.x[i][k]));
}
}
}
int det(juzhen &a) {
f=0;
gauss(a);
int ans=1;
rep(i,1,a.n) {
_mul(ans,a.x[i][i]);
}
// a.write();
if(f) return add(mod,-ans);
return ans;
}
void main() {
sf("%d",&t);
while(t--) {
sf("%d",&k);
rep(i,1,k) sf("%d",&n), a[i].n=n;
rep(i,1,k-1) a[i].m=a[i+1].n;
rep(i,1,k-1) sf("%d",&m[i]);
rep(i,1,k-1) a[i].clear();
rep(i,1,k-1) {
rep(j,1,m[i]) {
sf("%d%d",&u,&v);
a[i].x[u][v]=1;
}
}
rep(i,2,k-1) a[1]=a[1]*a[i];
// a[1].write();
pf("%d\n",det(a[1]));
}
}
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
pragmatic :: main();
}