RT,这个题卡住了,第二个样例直接就全寄了,但是看不明白哪里寄了。
做法和题解区的某解法一样,那就是把所有邻接矩阵乘起来行列式一下。不知道是我做法有锅还是写错了(求各位神仙帮帮忙哇
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#define mp(a,b) make_pair(a,b)
#define double long double
#define int long long
#define w(x) w[x]
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
using namespace std;
const int M=998244353;
struct MAT{
int A[210][210];
int n,m;
inline void cl(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
A[i][j]=0;
}
friend MAT operator*(const MAT a,const MAT b){
MAT c;
c.n=a.n,c.m=b.m;
for(int i=1;i<=c.n;i++)
for(int j=1;j<=b.m;j++)
for(int k=1;k<=a.m;k++)
c.A[i][j]=(c.A[i][j]+a.A[i][k]*b.A[k][j]%M);
return c;
}
};
inline int qp(int a,int x){
int res=1;
while(x){
if(x&1)res=res*a%M;
a=a*a%M;
x>>=1;
}
return res;
}
inline int inv(int a){return qp(a,M-2);}
inline int det(MAT x){
int res=1;
int n=x.n;
for(int i=1;i<=n;i++){
int p=i;
for(int j=i+1;j<=n;j++)
if(x.A[j][i]>x.A[p][i])p=j;
if(p!=i)res*=-1;
for(int j=i;j<=n;j++)
swap(x.A[i][j],x.A[p][j]);
for(int j=i+1;j<=n;j++){
int iv=x.A[j][i]*inv(x.A[i][i])%M;
for(int k=i;k<=n;k++){
x.A[j][k]-=x.A[i][k]*iv%M;
if(x.A[j][k]<0)x.A[j][k]+=M;
}
}
}
for(int i=1;i<=n;i++)
res=res*x.A[i][i]%M;
return res<0?M-res:res;
}
int n[110],k,m[110];
MAT G[110];
signed main(){
ios::sync_with_stdio(false);
//freopen("/Users/noip2019/Downloads/xpath/xpath2.in","r",stdin);
int t=0;
cin>>t;
while(t--){
cin>>k;
for(int i=1;i<=k;i++)
cin>>n[i],G[i].n=G[i-1].m=n[i];
for(int i=1;i<=k-1;i++)
cin>>m[i];
for(int i=1;i<=k-1;i++)
G[i].cl();
for(int i=1;i<=k-1;i++)
for(int j=1;j<=m[i];j++){
int u,v;
cin>>u>>v;
G[i].A[u][v]=1;
}
for(int i=2;i<=k-1;i++)
G[i]=G[i-1]*G[i];
cout<<det(G[k-1])<<endl;;
}
return 0;
}