#include #include #include #include const int P=998244353; long long p=1ll*P*P; inline int mul(const int &a,const int &b){return 1ll*a*b%P;} inline int sub(int a,const int &b){a-=b;return (a<0)?a+P:a;} inline int add(int a,const int &b){a+=b;return(a>=P)?a-P:a;} int qsm(int a,int b){ int ans=1; while(b){ if(b&1)ans=mul(ans,a); a=mul(a,a); b>>=1; } return ans; } typedef std::vector poly; poly interpolate(poly x,poly f){ poly tem,ans(x.size()); tem.push_back(1); for(int i=0;i=p)x-=p; c.num[i][j]=x%P; } return c; } int det(){ matrix a=*this; int ans=1; for(int i=0;ii)][l-(l>j)]=num[k][l]; ans.num[i][j]=(((i+j)&1)?sub:add)(0,tem.det()); } return ans; } matrix inv(int &ans){ matrix c(siz),a=*this; for(int i=0;i=i;--k) a.num[j][k]=sub(a.num[j][k],mul(a.num[i][k],a.num[j][i])); } } for(int i=siz-1;~i;--i) for(int j=i-1;~j;--j) if(a.num[j][i]){ for(int k=0;k=i;--k) num[j][k]=sub(num[j][k],mul(num[i][k],num[j][i])); } } // out(); } for(int i=siz-1;~i;--i) if(num[i][i]) for(int j=i-1;~j;--j) if(num[j][i]){ for(int k=siz-1;k>=i;--k) num[j][k]=sub(num[j][k],mul(num[i][k],num[j][i])); } } matrix adjugate(){ int det; matrix tem=inv(det),ans(siz); memset(ans.num,0,sizeof ans.num); if(det){ for(int i=0;i1)return ans; b.T(); // a.out(); // b.out(); int p1,p2; for(int i=0;ip1)][j-(j>p2)]=num[i][j]; ans.num[p1][p2]=Tem.det(); for(int i=p2-1;~i;--i){ for(int j=i+1;j<=p2;++j) ans.num[p1][i]=sub(ans.num[p1][i],mul(ans.num[p1][j],b.num[j][i])); ans.num[p1][i]=mul(ans.num[p1][i],qsm(b.num[i][i],P-2)); } // ans.out(); for(int i=p1-1;~i;--i) for(int j=p2;~j;--j){ for(int k=i+1;k<=p1;++k) ans.num[i][j]=sub(ans.num[i][j],mul(a.num[i][k],ans.num[k][j])); ans.num[i][j]=mul(ans.num[i][j],qsm(a.num[i][i],P-2)); } ans.T(); return ans; } int heisen_det(){ // out(); matrix a=*this; int ans=1; for(int i=0;i>=1; } return ans; } int n,m,k,t,d[101]; int main(){ scanf("%d",&t); for(int fd=1;fd<=t;++fd){ scanf("%d%d%d",&n,&m,&k); matrix a(n),b(n); for(int i=0;i>1)); } }