#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
//#include<cassert>
#include<cstdint>
#include<iostream>
#include<vector>usingnamespacestd;#include"../../matrix/gauss-elimination.hpp"
#include"../../modint/montgomery-modint.hpp"
#include"../../matrix/inverse-matrix.hpp"template<typenamemint>voidverify(constvector<vector<mint>>&a,constvector<vector<mint>>&b){intN=a.size();auto_a=a;auto[rank,det]=GaussElimination(_a);if(det==0orrank!=N){assert(det==0andrank!=N);if(!b.empty()){assert(falseand"b is not empty is spite of det == 0.");}return;}assert(!b.empty());vector<vector<mint>>c(N,vector<mint>(N));for(inti=0;i<N;i++){for(intk=0;k<N;k++){for(intj=0;j<N;j++){c[i][j]+=a[i][k]*b[k][j];}}}for(inti=0;i<N;i++){for(intj=0;j<N;j++){assert(c[i][j]==(i==j));}}}usingmint=LazyMontgomeryModInt<998244353>;voidtest(){inttestcase=1000;longlong_x=1;autorng=[&](){return_x=_x*100000%998244353;};for(intt=0;t<testcase;t++){intN=t%30+1;vector<vector<mint>>a(N,vector<mint>(N));for(auto&v:a){for(auto&x:v){x=rng();}}autob=inverse_matrix(a);verify(a,b);}}intmain(){test();inta,b;cin>>a>>b;cout<<a+b<<endl;}
#line 1 "verify/verify-unit-test/inverse-matrix.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
//#include<cassert>
#include<cstdint>
#include<iostream>
#include<vector>usingnamespacestd;#line 2 "matrix/gauss-elimination.hpp"
#include<utility>
#line 5 "matrix/gauss-elimination.hpp"
usingnamespacestd;// {rank, det(非正方行列の場合は未定義)} を返す// 型が double や Rational でも動くはず?(未検証)//// pivot 候補 : [0, pivot_end)template<typenameT>std::pair<int,T>GaussElimination(vector<vector<T>>&a,intpivot_end=-1,booldiagonalize=false){if(a.empty())return{0,1};intH=a.size(),W=a[0].size(),rank=0;if(pivot_end==-1)pivot_end=W;Tdet=1;for(intj=0;j<pivot_end;j++){intidx=-1;for(inti=rank;i<H;i++){if(a[i][j]!=T(0)){idx=i;break;}}if(idx==-1){det=0;continue;}if(rank!=idx)det=-det,swap(a[rank],a[idx]);det*=a[rank][j];if(diagonalize&&a[rank][j]!=T(1)){Tcoeff=T(1)/a[rank][j];for(intk=j;k<W;k++)a[rank][k]*=coeff;}intis=diagonalize?0:rank+1;for(inti=is;i<H;i++){if(i==rank)continue;if(a[i][j]!=T(0)){Tcoeff=a[i][j]/a[rank][j];for(intk=j;k<W;k++)a[i][k]-=a[rank][k]*coeff;}}rank++;}returnmake_pair(rank,det);}#line 2 "modint/montgomery-modint.hpp"
template<uint32_tmod>structLazyMontgomeryModInt{usingmint=LazyMontgomeryModInt;usingi32=int32_t;usingu32=uint32_t;usingu64=uint64_t;staticconstexpru32get_r(){u32ret=mod;for(i32i=0;i<4;++i)ret*=2-mod*ret;returnret;}staticconstexpru32r=get_r();staticconstexpru32n2=-u64(mod)%mod;static_assert(mod<(1<<30),"invalid, mod >= 2 ^ 30");static_assert((mod&1)==1,"invalid, mod % 2 == 0");static_assert(r*mod==1,"this code has bugs.");u32a;constexprLazyMontgomeryModInt():a(0){}constexprLazyMontgomeryModInt(constint64_t&b):a(reduce(u64(b%mod+mod)*n2)){};staticconstexpru32reduce(constu64&b){return(b+u64(u32(b)*u32(-r))*mod)>>32;}constexprmint&operator+=(constmint&b){if(i32(a+=b.a-2*mod)<0)a+=2*mod;return*this;}constexprmint&operator-=(constmint&b){if(i32(a-=b.a)<0)a+=2*mod;return*this;}constexprmint&operator*=(constmint&b){a=reduce(u64(a)*b.a);return*this;}constexprmint&operator/=(constmint&b){*this*=b.inverse();return*this;}constexprmintoperator+(constmint&b)const{returnmint(*this)+=b;}constexprmintoperator-(constmint&b)const{returnmint(*this)-=b;}constexprmintoperator*(constmint&b)const{returnmint(*this)*=b;}constexprmintoperator/(constmint&b)const{returnmint(*this)/=b;}constexprbooloperator==(constmint&b)const{return(a>=mod?a-mod:a)==(b.a>=mod?b.a-mod:b.a);}constexprbooloperator!=(constmint&b)const{return(a>=mod?a-mod:a)!=(b.a>=mod?b.a-mod:b.a);}constexprmintoperator-()const{returnmint()-mint(*this);}constexprmintoperator+()const{returnmint(*this);}constexprmintpow(u64n)const{mintret(1),mul(*this);while(n>0){if(n&1)ret*=mul;mul*=mul;n>>=1;}returnret;}constexprmintinverse()const{intx=get(),y=mod,u=1,v=0,t=0,tmp=0;while(y>0){t=x/y;x-=t*y,u-=t*v;tmp=x,x=y,y=tmp;tmp=u,u=v,v=tmp;}returnmint{u};}friendostream&operator<<(ostream&os,constmint&b){returnos<<b.get();}friendistream&operator>>(istream&is,mint&b){int64_tt;is>>t;b=LazyMontgomeryModInt<mod>(t);return(is);}constexpru32get()const{u32ret=reduce(a);returnret>=mod?ret-mod:ret;}staticconstexpru32get_mod(){returnmod;}};#line 2 "matrix/inverse-matrix.hpp"
#line 4 "matrix/inverse-matrix.hpp"
template<typenamemint>vector<vector<mint>>inverse_matrix(constvector<vector<mint>>&a){intN=a.size();assert(N>0);assert(N==(int)a[0].size());vector<vector<mint>>m(N,vector<mint>(2*N));for(inti=0;i<N;i++){copy(begin(a[i]),end(a[i]),begin(m[i]));m[i][N+i]=1;}auto[rank,det]=GaussElimination(m,N,true);if(rank!=N)return{};vector<vector<mint>>b(N);for(inti=0;i<N;i++){copy(begin(m[i])+N,end(m[i]),back_inserter(b[i]));}returnb;}#line 12 "verify/verify-unit-test/inverse-matrix.test.cpp"
template<typenamemint>voidverify(constvector<vector<mint>>&a,constvector<vector<mint>>&b){intN=a.size();auto_a=a;auto[rank,det]=GaussElimination(_a);if(det==0orrank!=N){assert(det==0andrank!=N);if(!b.empty()){assert(falseand"b is not empty is spite of det == 0.");}return;}assert(!b.empty());vector<vector<mint>>c(N,vector<mint>(N));for(inti=0;i<N;i++){for(intk=0;k<N;k++){for(intj=0;j<N;j++){c[i][j]+=a[i][k]*b[k][j];}}}for(inti=0;i<N;i++){for(intj=0;j<N;j++){assert(c[i][j]==(i==j));}}}usingmint=LazyMontgomeryModInt<998244353>;voidtest(){inttestcase=1000;longlong_x=1;autorng=[&](){return_x=_x*100000%998244353;};for(intt=0;t<testcase;t++){intN=t%30+1;vector<vector<mint>>a(N,vector<mint>(N));for(auto&v:a){for(auto&x:v){x=rng();}}autob=inverse_matrix(a);verify(a,b);}}intmain(){test();inta,b;cin>>a>>b;cout<<a+b<<endl;}