#define PROBLEM "https://judge.yosupo.jp/problem/inverse_matrix"
#include<bits/stdc++.h>#include"library/linearalgebra/Matrix.hpp"
#include"library/mod/Modint.hpp"usingmint=Mint<longlong,998244353>;usingM=Matrix<mint>;#define REP(i, n) for (int i = 0; i < (n); i++)
intmain(){intn;std::cin>>n;MA(n,n);std::cin>>A;autoB=A.inv();if(B.has_value())REP(i,n)REP(j,n)std::cout<<B.value()[i][j]<<"\n "[j+1<n];elsestd::cout<<-1<<"\n";}
#line 1 "test/library-checker/Matrix/Inverse.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/inverse_matrix"
#include<bits/stdc++.h>#line 2 "library/linearalgebra/Matrix.hpp"
#define REP_(i, n) for (int i = 0; i < (n); i++)
#define REP2_(i, s, n) for (int i = (s); i < (n); i++)
template<typenameK>structMatrix{usingvalue_type=K;usingvec=std::vector<K>;usingmat=std::vector<vec>;size_tr,c;matM;Matrix(size_tr,size_tc):r(r),c(c),M(r,vec(c,K())){}Matrix(matA):M(A),r(A.size()),c(A[0].size()){}vec&operator[](size_tk){returnM[k];}constvec&operator[](size_tk)const{returnM[k];}Matrix&operator+=(constMatrix&A){assert(r==A.r&&c==A.c);REP_(i,r)REP_(j,c)M[i][j]+=A[i][j];return*this;}Matrix&operator-=(constMatrix&A){assert(r==A.r&&c==A.c);REP_(i,r)REP_(j,c)M[i][j]-=A[i][j];return*this;}Matrixoperator+(constMatrix&A){returnMatrix(M)+=A;}Matrixoperator-(constMatrix&A){returnMatrix(M)-=A;}friendMatrixoperator*(constMatrix&A,constMatrix&B){assert(A.c==B.r);Matrixres(A.r,B.c);REP_(i,A.r)REP_(k,A.c)REP_(j,B.c)res[i][j]+=A[i][k]*B[k][j];returnres;}Matrix&operator*=(constMatrix&A){M=((*this)*A).M;return*this;}booloperator==(constMatrix&A){if(r!=A.r||c!=A.c)returnfalse;REP_(i,r)REP_(j,c)if(M[i][j]!=A[i][j])returnfalse;returntrue;}booloperator!=(constMatrix&A){return!((*this)==A);}staticMatrixI(size_tn){Matrixres(n,n);REP_(i,n)res[i][i]=K(1);returnres;}Matrixpow(longlongn)const{assert(n>=0&&r==c);MatrixA(M),res=I(r);while(n){if(n&1)res*=A;A*=A;n>>=1;}returnres;}std::pair<int,int>GaussJordan(){intrnk=0,cnt=0;REP_(k,c){if(M[rnk][k]==0)REP2_(i,rnk+1,r)if(M[i][k]!=0){std::swap(M[i],M[rnk]);cnt^=1;break;}if(M[rnk][k]==0)continue;REP_(i,r)if(i!=rnk){Kx=M[i][k]/M[rnk][k];REP_(j,c)M[i][j]-=M[rnk][j]*x;}if(++rnk==r)break;}return{rnk,cnt};}Kdet()const{assert(r==c);MatrixA(M);constauto&[rnk,cnt]=A.GaussJordan();if(rnk!=r)return0;Kres=1;REP_(i,r)res*=A[i][i];return(cnt?-res:res);}std::optional<Matrix>inv()const{assert(r==c);MatrixA(r,c+c);REP_(i,r)REP_(j,c)A[i][j]=M[i][j];REP_(i,r)REP_(j,c)A[i][c+j]=K(i==j);A.GaussJordan();REP_(i,r)if(A[i][i]==0)returnstd::nullopt;Matrixres(r,c);REP_(i,r)REP_(j,c)res[i][j]=A[i][c+j]/A[i][i];returnres;}friendstd::ostream&operator<<(std::ostream&os,constMatrix&M){os<<M.M;returnos;}friendstd::istream&operator>>(std::istream&is,Matrix&M){REP_(i,M.r)REP_(j,M.c)is>>M.M[i][j];returnis;}};#undef REP_
#undef REP2_
#line 2 "library/math/ExtraGCD.hpp"
usingll=longlong;std::pair<ll,ll>ext_gcd(lla,llb){if(b==0)return{1,0};auto[X,Y]=ext_gcd(b,a%b);// bX + (a%b)Y = gcd(a,b)// a%b = a - b(a/b)// ∴ aY + b(X-(a/b)Y) = gcd(a,b)llx=Y,y=X-(a/b)*Y;return{x,y};}#line 3 "library/mod/Modint.hpp"
template<typenameT,TMOD=998244353>structMint{inlinestaticconstexprTmod=MOD;Tv;Mint():v(0){}Mint(signedv):v(v){}Mint(longlongt){v=t%MOD;if(v<0)v+=MOD;}staticMintraw(intv){Mintx;x.v=v;returnx;}Mintpow(longlongk)const{Mintres(1),tmp(v);while(k){if(k&1)res*=tmp;tmp*=tmp;k>>=1;}returnres;}staticMintadd_identity(){returnMint(0);}staticMintmul_identity(){returnMint(1);}// Mint inv()const{return pow(MOD-2);}Mintinv()const{returnMint(ext_gcd(v,mod).first);}Mint&operator+=(Minta){v+=a.v;if(v>=MOD)v-=MOD;return*this;}Mint&operator-=(Minta){v+=MOD-a.v;if(v>=MOD)v-=MOD;return*this;}Mint&operator*=(Minta){v=1LL*v*a.v%MOD;return*this;}Mint&operator/=(Minta){return(*this)*=a.inv();}Mintoperator+(Minta)const{returnMint(v)+=a;}Mintoperator-(Minta)const{returnMint(v)-=a;}Mintoperator*(Minta)const{returnMint(v)*=a;}Mintoperator/(Minta)const{returnMint(v)/=a;}#define FRIEND(op) \
friend Mint operator op(int a, Mint b) { return Mint(a) op b; }
FRIEND(+);FRIEND(-);FRIEND(*);FRIEND(/);#undef FRIEND
Mintoperator+()const{return*this;}Mintoperator-()const{returnv?Mint(MOD-v):Mint(v);}booloperator==(constMinta)const{returnv==a.v;}booloperator!=(constMinta)const{returnv!=a.v;}staticMintcomb(longlongn,intk){Mintnum(1),dom(1);for(inti=0;i<k;i++){num*=Mint(n-i);dom*=Mint(i+1);}returnnum/dom;}friendstd::ostream&operator<<(std::ostream&os,constMint&m){os<<m.v;returnos;}friendstd::istream&operator>>(std::istream&is,Mint&m){is>>m.v;m.v%=MOD;if(m.v<0)m.v+=MOD;returnis;}};#line 6 "test/library-checker/Matrix/Inverse.test.cpp"
usingmint=Mint<longlong,998244353>;usingM=Matrix<mint>;#define REP(i, n) for (int i = 0; i < (n); i++)
intmain(){intn;std::cin>>n;MA(n,n);std::cin>>A;autoB=A.inv();if(B.has_value())REP(i,n)REP(j,n)std::cout<<B.value()[i][j]<<"\n "[j+1<n];elsestd::cout<<-1<<"\n";}