RT,60 pts,目前的情况是无法正确判断行列式的正负(也就是大多时候答案正确但剩下的时候输出答案的相反数)
#include<bits/stdc++.h>
using namespace std;
const int Mod=998244353;
long long fpw(long long x,int y)
{
long long res=1,cur=x;
for(int i=1;i<=y;i<<=1)
{
if(y&i)res=res*cur%Mod;
cur=cur*cur%Mod;
}
return res;
}
struct matrix
{
int r,c;
long long a[205][205];
void mat0(int R,int C){r=R;c=C;memset(a,0,sizeof(a));}
void print(char format[])
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
printf(format,a[i][j]);
puts("");
}
}
long long Gauss() // return value is det A
{
long long fenmu=1;
int n=r;
for(int k=1;k<=n;k++)
{
bool fnd=0;
for(int i=k;i<=n;i++)
{
for(int j=k;j<=n;j++)
if(a[i][j]!=0)
{
for(int t=k;t<=n;t++)swap(a[k][t],a[i][t]);
for(int t=k;t<=n;t++)swap(a[t][k],a[t][j]);
if((i+j)%2)fenmu*=-1;
fnd=1;break;
}
if(fnd)break;
}
for(int i=k+1;i<=n;i++)
{
fenmu=fenmu*a[k][k]%Mod;
for(int j=n;j>=k;j--)
a[i][j]=(a[i][j]*a[k][k]-a[k][j]*a[i][k])%Mod;
}
}
fenmu=fpw(fenmu,Mod-2);
for(int i=1;i<=n;i++)fenmu=fenmu*a[i][i]%Mod;
return fenmu<0?fenmu+Mod:fenmu;
}
};
matrix operator * (matrix x,matrix y)
{
assert(x.c==y.r);
matrix ans;
ans.mat0(x.r,y.c);
ans.r=x.r;ans.c=y.c;
for(int i=1;i<=x.r;i++)
for(int j=1;j<=x.c;j++)
for(int k=1;k<=y.c;k++)
ans.a[i][k]=(x.a[i][j]*y.a[j][k]+ans.a[i][k])%Mod;
return ans;
}
int T,k,n[105],m[105];
matrix a[105];
int main()
{
freopen("P7736_1.in","r",stdin);
int u,v;
for(scanf("%d",&T);T;T--)
{
scanf("%d",&k);
//cout<<"k="<<k<<endl;
for(int i=1;i<=k;i++)
scanf("%d",&n[i]);
for(int i=1;i<k;i++)
scanf("%d",&m[i]);
//puts("hello");
for(int i=1;i<k;i++)
{
a[i].r=n[i];
a[i].c=n[i+1];
memset(a[i].a,0,sizeof a[i]);
for(int t=1;t<=m[i];t++)
{
scanf("%d%d",&u,&v);
a[i].a[u][v]=1;
}
//puts("hi");
}
//a[1].print("%3d");
//a[2].print("%3d");
for(int i=2;i<k;i++)
a[i]=a[i-1]*a[i];
a[k-1].print("%3d");
printf("%lld\n",a[k-1].Gauss());
}
return 0;
}