#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
#include"../../template/template.hpp"//#include"../../math/rational-binomial.hpp"
#include"../../math/rational-fps.hpp"
#include"../../math/rational.hpp"//#include"../../modint/montgomery-modint.hpp"
#include"../../modulo/binomial.hpp"usingmint=LazyMontgomeryModInt<998244353>;//#include"../../misc/rng.hpp"usingnamespaceNyaan;voidNyaan::solve(){{Rationala{4,3},b{2,3};assert(a+b==2);assert(a-b==Rational(2,3));assert(a*b==Rational(8,9));assert(a/b==2);assert(a.inverse()==Rational(3,4));assert(a.pow(3)==Rational(64,27));assert((a>b)==true);assert((a>=b)==true);assert((a<b)==false);assert((a<=b)==false);}{Binomial_rational<Rational>C;assert(C.fac(3)==6);assert(C.finv(3)==Rational(1,6));assert(C(4,2)==6);assert(C(vi{3,2})==10);}{usingfps=FormalPowerSeries_rational<Rational>;{fpsf{1,2,{3,2}},g{{1,4},5};fpsh{{5,4},7,{3,2}};assert(f+g==h);h=fps{{3,4},-3,{3,2}};assert(f-g==h);assert(f*g%g==fps{});assert(f*g%f==fps{});}{fpse{1,1,{1,2},{1,6},{1,24},{1,120}};fpsf=e.pow(10);trc(f);rep(i,sz(e)){assert(e[i]*Rational{10}.pow(i)==f[i]);}}}// mint と挙動の比較{autocomp=[&](inti,intj,intk,intl){rep(b,16){intii=(b>>0)%2?-i:+i;intjj=(b>>1)%2?-j:+j;intkk=(b>>2)%2?-k:+k;intll=(b>>3)%2?-l:+l;Rationalx{ii,jj},y{kk,ll};mintX=mint{ii}/jj;mintY=mint{kk}/ll;assert(X+Y==(x+y).to_mint(998244353));assert(X-Y==(x-y).to_mint(998244353));assert(X*Y==(x*y).to_mint(998244353));if(Y!=0){assert(X/Y==(x/y).to_mint(998244353));}}};rep(i,20)rep1(j,20)rep(k,20)rep1(l,20)comp(i,j,k,l);rep(t,10000){intlower=t%2?1:32000;lli=rng(lower,35000);llj=rng(lower,35000);llk=rng(lower,35000);lll=rng(lower,35000);comp(i,j,k,l);}}// binom, mint と挙動の比較{Binomial_rational<Rational>C1;Binomial<mint>C2;reg(i,-15,15){assert(C2.fac(i)==C1.fac(i).to_mint(998244353));assert(C2.finv(i)==C1.finv(i).to_mint(998244353));assert(C2.inv(i)==C1.inv(i).to_mint(998244353));reg(j,-15,15){assert(C2(i,j)==C1(i,j).to_mint(998244353));assert(C2.P(i,j)==C1.P(i,j).to_mint(998244353));if(i+j<20)assert(C2.H(i,j)==C1.H(i,j).to_mint(998244353));}}}cerr<<"OK"<<endl;{ints,t;cin>>s>>t;cout<<s+t<<"\n";}}
#line 1 "verify/verify-unit-test/rational-number.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
#line 2 "template/template.hpp"
usingnamespacestd;// intrinstic#include<immintrin.h>#include<algorithm>
#include<array>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cfenv>
#include<cfloat>
#include<chrono>
#include<cinttypes>
#include<climits>
#include<cmath>
#include<complex>
#include<cstdarg>
#include<cstddef>
#include<cstdint>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<deque>
#include<fstream>
#include<functional>
#include<initializer_list>
#include<iomanip>
#include<ios>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<random>
#include<set>
#include<sstream>
#include<stack>
#include<streambuf>
#include<string>
#include<tuple>
#include<type_traits>
#include<typeinfo>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>// utility#line 3 "template/util.hpp"
namespaceNyaan{usingll=longlong;usingi64=longlong;usingu64=unsignedlonglong;usingi128=__int128_t;usingu128=__uint128_t;template<typenameT>usingV=vector<T>;template<typenameT>usingVV=vector<vector<T>>;usingvi=vector<int>;usingvl=vector<longlong>;usingvd=V<double>;usingvs=V<string>;usingvvi=vector<vector<int>>;usingvvl=vector<vector<longlong>>;template<typenameT>usingminpq=priority_queue<T,vector<T>,greater<T>>;template<typenameT,typenameU>structP:pair<T,U>{template<typename...Args>P(Args...args):pair<T,U>(args...){}usingpair<T,U>::first;usingpair<T,U>::second;P&operator+=(constP&r){first+=r.first;second+=r.second;return*this;}P&operator-=(constP&r){first-=r.first;second-=r.second;return*this;}P&operator*=(constP&r){first*=r.first;second*=r.second;return*this;}template<typenameS>P&operator*=(constS&r){first*=r,second*=r;return*this;}Poperator+(constP&r)const{returnP(*this)+=r;}Poperator-(constP&r)const{returnP(*this)-=r;}Poperator*(constP&r)const{returnP(*this)*=r;}template<typenameS>Poperator*(constS&r)const{returnP(*this)*=r;}Poperator-()const{returnP{-first,-second};}};usingpl=P<ll,ll>;usingpi=P<int,int>;usingvp=V<pl>;constexprintinf=1001001001;constexprlonglonginfLL=4004004004004004004LL;template<typenameT>intsz(constT&t){returnt.size();}template<typenameT,typenameU>inlineboolamin(T&x,Uy){return(y<x)?(x=y,true):false;}template<typenameT,typenameU>inlineboolamax(T&x,Uy){return(x<y)?(x=y,true):false;}template<typenameT>inlineTMax(constvector<T>&v){return*max_element(begin(v),end(v));}template<typenameT>inlineTMin(constvector<T>&v){return*min_element(begin(v),end(v));}template<typenameT>inlinelonglongSum(constvector<T>&v){returnaccumulate(begin(v),end(v),0LL);}template<typenameT>intlb(constvector<T>&v,constT&a){returnlower_bound(begin(v),end(v),a)-begin(v);}template<typenameT>intub(constvector<T>&v,constT&a){returnupper_bound(begin(v),end(v),a)-begin(v);}constexprlonglongTEN(intn){longlongret=1,x=10;for(;n;x*=x,n>>=1)ret*=(n&1?x:1);returnret;}template<typenameT,typenameU>pair<T,U>mkp(constT&t,constU&u){returnmake_pair(t,u);}template<typenameT>vector<T>mkrui(constvector<T>&v,boolrev=false){vector<T>ret(v.size()+1);if(rev){for(inti=int(v.size())-1;i>=0;i--)ret[i]=v[i]+ret[i+1];}else{for(inti=0;i<int(v.size());i++)ret[i+1]=ret[i]+v[i];}returnret;};template<typenameT>vector<T>mkuni(constvector<T>&v){vector<T>ret(v);sort(ret.begin(),ret.end());ret.erase(unique(ret.begin(),ret.end()),ret.end());returnret;}template<typenameF>vector<int>mkord(intN,Ff){vector<int>ord(N);iota(begin(ord),end(ord),0);sort(begin(ord),end(ord),f);returnord;}template<typenameT>vector<int>mkinv(vector<T>&v){intmax_val=*max_element(begin(v),end(v));vector<int>inv(max_val+1,-1);for(inti=0;i<(int)v.size();i++)inv[v[i]]=i;returninv;}vector<int>mkiota(intn){vector<int>ret(n);iota(begin(ret),end(ret),0);returnret;}template<typenameT>Tmkrev(constT&v){Tw{v};reverse(begin(w),end(w));returnw;}template<typenameT>boolnxp(T&v){returnnext_permutation(begin(v),end(v));}// 返り値の型は入力の T に依存// i 要素目 : [0, a[i])template<typenameT>vector<vector<T>>product(constvector<T>&a){vector<vector<T>>ret;vector<T>v;autodfs=[&](autorc,inti)->void{if(i==(int)a.size()){ret.push_back(v);return;}for(intj=0;j<a[i];j++)v.push_back(j),rc(rc,i+1),v.pop_back();};dfs(dfs,0);returnret;}// F : void(T&), mod を取る操作// T : 整数型のときはオーバーフローに注意するtemplate<typenameT,typenameF>TPower(Ta,longlongn,constT&I,F&&f){static_assert(std::is_invocable_r_v<void,F&,T&>,"Power callback must be callable as void(T&)");Tres=I;for(;n;std::invoke(f,a=a*a),n>>=1){if(n&1)std::invoke(f,res=res*a);}returnres;}// T : 整数型のときはオーバーフローに注意するtemplate<typenameT>TPower(Ta,longlongn,constT&I=T{1}){autono_op=[](T&)->void{};returnPower(a,n,I,no_op);}template<typenameT>TRev(constT&v){Tres=v;reverse(begin(res),end(res));returnres;}template<typenameT>vector<T>Transpose(constvector<T>&v){usingU=typenameT::value_type;if(v.empty())return{};intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){res[j][i]=v[i][j];}}returnres;}template<typenameT>vector<T>Rotate(constvector<T>&v,intclockwise=true){usingU=typenameT::value_type;intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){if(clockwise){res[W-1-j][i]=v[i][j];}else{res[j][H-1-i]=v[i][j];}}}returnres;}}// namespace Nyaan#line 58 "template/template.hpp"
// bit operation#line 1 "template/bitop.hpp"
namespaceNyaan{__attribute__((target("popcnt")))inlineintpopcnt(constu64&a){return__builtin_popcountll(a);}inlineintlsb(constu64&a){returna?__builtin_ctzll(a):64;}inlineintctz(constu64&a){returna?__builtin_ctzll(a):64;}inlineintmsb(constu64&a){returna?63-__builtin_clzll(a):-1;}template<typenameT>inlineintgbit(constT&a,inti){return(a>>i)&1;}template<typenameT>inlinevoidsbit(T&a,inti,boolb){if(gbit(a,i)!=b)a^=T(1)<<i;}constexprlonglongPW(intn){return1LL<<n;}constexprlonglongMSK(intn){return(1LL<<n)-1;}}// namespace Nyaan#line 61 "template/template.hpp"
// inout#line 1 "template/inout.hpp"
namespaceNyaan{template<typenameT,typenameU>ostream&operator<<(ostream&os,constpair<T,U>&p){os<<p.first<<" "<<p.second;returnos;}template<typenameT,typenameU>istream&operator>>(istream&is,pair<T,U>&p){is>>p.first>>p.second;returnis;}template<typenameT>ostream&operator<<(ostream&os,constvector<T>&v){ints=(int)v.size();for(inti=0;i<s;i++)os<<(i?" ":"")<<v[i];returnos;}template<typenameT>istream&operator>>(istream&is,vector<T>&v){for(auto&x:v)is>>x;returnis;}istream&operator>>(istream&is,__int128_t&x){stringS;is>>S;x=0;intflag=0;for(auto&c:S){if(c=='-'){flag=true;continue;}x*=10;x+=c-'0';}if(flag)x=-x;returnis;}istream&operator>>(istream&is,__uint128_t&x){stringS;is>>S;x=0;for(auto&c:S){x*=10;x+=c-'0';}returnis;}ostream&operator<<(ostream&os,__int128_tx){if(x==0)returnos<<0;if(x<0)os<<'-',x=-x;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}ostream&operator<<(ostream&os,__uint128_tx){if(x==0)returnos<<0;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}voidin(){}template<typenameT,class...U>voidin(T&t,U&...u){cin>>t;in(u...);}voidout(){cout<<"\n";}template<typenameT,class...U,charsep=' '>voidout(constT&t,constU&...u){cout<<t;if(sizeof...(u))cout<<sep;out(u...);}structIoSetupNya{IoSetupNya(){cin.tie(nullptr);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);cerr<<fixed<<setprecision(7);}}iosetupnya;}// namespace Nyaan#line 64 "template/template.hpp"
// debug#line 1 "template/debug.hpp"
namespaceDebugImpl{template<typenameU,typename=void>structis_specialize:false_type{};template<typenameU>structis_specialize<U,typenameconditional<false,typenameU::iterator,void>::type>:true_type{};template<typenameU>structis_specialize<U,typenameconditional<false,decltype(U::first),void>::type>:true_type{};template<typenameU>structis_specialize<U,enable_if_t<is_integral<U>::value,void>>:true_type{};voiddump(constchar&t){cerr<<t;}voiddump(conststring&t){cerr<<t;}voiddump(constbool&t){cerr<<(t?"true":"false");}voiddump(__int128_tt){if(t==0)cerr<<0;if(t<0)cerr<<'-',t=-t;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}voiddump(__uint128_tt){if(t==0)cerr<<0;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}template<typenameU,enable_if_t<!is_specialize<U>::value,nullptr_t>=nullptr>voiddump(constU&t){cerr<<t;}template<typenameT>voiddump(constT&t,enable_if_t<is_integral<T>::value>*=nullptr){stringres;if(t==Nyaan::inf)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::inf)res="-inf";}ifconstexpr(sizeof(T)==8){if(t==Nyaan::infLL)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::infLL)res="-inf";}}if(res.empty())res=to_string(t);cerr<<res;}template<typenameT,typenameU>voiddump(constpair<T,U>&);template<typenameT>voiddump(constpair<T*,int>&);template<typenameT>voiddump(constT&t,enable_if_t<!is_void<typenameT::iterator>::value>*=nullptr){cerr<<"[ ";for(autoit=t.begin();it!=t.end();){dump(*it);cerr<<(++it==t.end()?"":", ");}cerr<<" ]";}template<typenameT,typenameU>voiddump(constpair<T,U>&t){cerr<<"( ";dump(t.first);cerr<<", ";dump(t.second);cerr<<" )";}template<typenameT>voiddump(constpair<T*,int>&t){cerr<<"[ ";for(inti=0;i<t.second;i++){dump(t.first[i]);cerr<<(i==t.second-1?"":", ");}cerr<<" ]";}voidtrace(){cerr<<endl;}template<typenameHead,typename...Tail>voidtrace(Head&&head,Tail&&...tail){cerr<<" ";dump(head);if(sizeof...(tail)!=0)cerr<<",";trace(std::forward<Tail>(tail)...);}}// namespace DebugImpl#ifdef NyaanDebug
#define trc(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc(...) (void(0))
#endif
#ifdef NyaanLocal
#define trc2(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc2(...) (void(0))
#endif
#line 67 "template/template.hpp"
// macro#line 1 "template/macro.hpp"
#define each(x, v) for (auto&& x : v)
#define each2(x, y, v) for (auto&& [x, y] : v)
#define all(v) (v).begin(), (v).end()
#define rep(i, N) for (long long i = 0; i < (long long)(N); i++)
#define repr(i, N) for (long long i = (long long)(N)-1; i >= 0; i--)
#define rep1(i, N) for (long long i = 1; i <= (long long)(N); i++)
#define repr1(i, N) for (long long i = (N); (long long)(i) > 0; i--)
#define reg(i, a, b) for (long long i = (a); i < (b); i++)
#define regr(i, a, b) for (long long i = (b)-1; i >= (a); i--)
#define fi first
#define se second
#define ini(...) \
int __VA_ARGS__; \
in(__VA_ARGS__)
#define inl(...) \
long long __VA_ARGS__; \
in(__VA_ARGS__)
#define ins(...) \
string __VA_ARGS__; \
in(__VA_ARGS__)
#define in2(s, t) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i]); \
}
#define in3(s, t, u) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i]); \
}
#define in4(s, t, u, v) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i], v[i]); \
}
#define die(...) \
do { \
Nyaan::out(__VA_ARGS__); \
return; \
} while (0)
#line 70 "template/template.hpp"
namespaceNyaan{voidsolve();}intmain(){Nyaan::solve();}#line 4 "verify/verify-unit-test/rational-number.test.cpp"
//#line 2 "math/rational-binomial.hpp"
#line 2 "math/rational.hpp"
#line 6 "math/rational.hpp"
usingnamespacestd;#line 2 "internal/internal-type-traits.hpp"
#line 4 "internal/internal-type-traits.hpp"
usingnamespacestd;namespacenyaan_internal{template<typenameT>usingis_broadly_integral=typenameconditional_t<is_integral_v<T>||is_same_v<T,__int128_t>||is_same_v<T,__uint128_t>,true_type,false_type>::type;template<typenameT>usingis_broadly_signed=typenameconditional_t<is_signed_v<T>||is_same_v<T,__int128_t>,true_type,false_type>::type;template<typenameT>usingis_broadly_unsigned=typenameconditional_t<is_unsigned_v<T>||is_same_v<T,__uint128_t>,true_type,false_type>::type;#define ENABLE_VALUE(x) \
template <typename T> \
constexpr bool x##_v = x<T>::value;
ENABLE_VALUE(is_broadly_integral);ENABLE_VALUE(is_broadly_signed);ENABLE_VALUE(is_broadly_unsigned);#undef ENABLE_VALUE
#define ENABLE_HAS_TYPE(var) \
template <class, class = void> \
struct has_##var : false_type {}; \
template <class T> \
struct has_##var<T, void_t<typename T::var>> : true_type {}; \
template <class T> \
constexpr auto has_##var##_v = has_##var<T>::value;
#define ENABLE_HAS_VAR(var) \
template <class, class = void> \
struct has_##var : false_type {}; \
template <class T> \
struct has_##var<T, void_t<decltype(T::var)>> : true_type {}; \
template <class T> \
constexpr auto has_##var##_v = has_##var<T>::value;
}// namespace nyaan_internal#line 2 "math-fast/gcd.hpp"
#line 4 "math-fast/gcd.hpp"
usingnamespacestd;namespaceBinaryGCDImpl{usingu64=unsignedlonglong;usingi8=char;u64binary_gcd(u64a,u64b){if(a==0||b==0)returna+b;i8n=__builtin_ctzll(a);i8m=__builtin_ctzll(b);a>>=n;b>>=m;n=min(n,m);while(a!=b){u64d=a-b;i8s=__builtin_ctzll(d);boolf=a>b;b=f?b:a;a=(f?d:-d)>>s;}returna<<n;}usingu128=__uint128_t;// a > 0intctz128(u128a){u64lo=a&u64(-1);returnlo?__builtin_ctzll(lo):64+__builtin_ctzll(a>>64);}u128binary_gcd128(u128a,u128b){if(a==0||b==0)returna+b;i8n=ctz128(a);i8m=ctz128(b);a>>=n;b>>=m;n=min(n,m);while(a!=b){u128d=a-b;i8s=ctz128(d);boolf=a>b;b=f?b:a;a=(f?d:-d)>>s;}returna<<n;}}// namespace BinaryGCDImpllonglongbinary_gcd(longlonga,longlongb){returnBinaryGCDImpl::binary_gcd(abs(a),abs(b));}__int128_tbinary_gcd128(__int128_ta,__int128_tb){if(a<0)a=-a;if(b<0)b=-b;returnBinaryGCDImpl::binary_gcd128(a,b);}/**
* @brief binary GCD
*/#line 10 "math/rational.hpp"
// T : 値, U : 比較用template<typenameT,typenameU>structRationalBase{usingR=RationalBase;usingKey=T;Tx,y;RationalBase():x(0),y(1){}template<typenameT1>RationalBase(constT1&_x):RationalBase<T,U>(_x,T1{1}){}template<typenameT1,typenameT2>RationalBase(constpair<T1,T2>&_p):RationalBase<T,U>(_p.first,_p.second){}template<typenameT1,typenameT2>RationalBase(constT1&_x,constT2&_y):x(_x),y(_y){assert(y!=0);if(y==-1)x=-x,y=-y;if(y!=1){Tg;ifconstexpr(nyaan_internal::is_broadly_integral_v<T>){ifconstexpr(sizeof(T)==16){g=binary_gcd128(x,y);}else{g=binary_gcd(x,y);}}else{g=gcd(x,y);}if(g!=0)x/=g,y/=g;if(y<0)x=-x,y=-y;}}// y = 0 の代入も認めるstaticRraw(T_x,T_y){Rr;r.x=_x,r.y=_y;returnr;}friendRoperator+(constR&l,constR&r){if(l.y==r.y)returnR{l.x+r.x,l.y};returnR{l.x*r.y+l.y*r.x,l.y*r.y};}friendRoperator-(constR&l,constR&r){if(l.y==r.y)returnR{l.x-r.x,l.y};returnR{l.x*r.y-l.y*r.x,l.y*r.y};}friendRoperator*(constR&l,constR&r){returnR{l.x*r.x,l.y*r.y};}friendRoperator/(constR&l,constR&r){returnR{l.x*r.y,l.y*r.x};}R&operator+=(constR&r){return(*this)=(*this)+r;}R&operator-=(constR&r){return(*this)=(*this)-r;}R&operator*=(constR&r){return(*this)=(*this)*r;}R&operator/=(constR&r){return(*this)=(*this)/r;}Roperator-()const{returnraw(-x,y);}Rinverse()const{assert(x!=0);Rr=raw(y,x);if(r.y<0)r.x=-r.x,r.y=-r.y;returnr;}Rpow(longlongp)const{Rres{1},base{*this};while(p){if(p&1)res*=base;base*=base;p>>=1;}returnres;}friendbooloperator==(constR&l,constR&r){returnl.x==r.x&&l.y==r.y;};friendbooloperator!=(constR&l,constR&r){returnl.x!=r.x||l.y!=r.y;};friendbooloperator<(constR&l,constR&r){returnU{l.x}*r.y<U{l.y}*r.x;};friendbooloperator<=(constR&l,constR&r){returnl<r||l==r;}friendbooloperator>(constR&l,constR&r){returnU{l.x}*r.y>U{l.y}*r.x;};friendbooloperator>=(constR&l,constR&r){returnl>r||l==r;}friendostream&operator<<(ostream&os,constR&r){os<<r.x;if(r.x!=0&&r.y!=1)os<<"/"<<r.y;returnos;}// T にキャストされるので T が bigint の場合は to_ll も要るTto_mint(Tmod)const{assert(mod!=0);Ta=y,b=mod,u=1,v=0,t;while(b>0){t=a/b;swap(a-=t*b,b);swap(u-=t*v,v);}returnU((u%mod+mod)%mod)*x%mod;}};usingRational=RationalBase<longlong,__int128_t>;usingFraction=Rational;#line 4 "math/rational-binomial.hpp"
template<typenameR=Rational>structBinomial_rational{vector<R>fc;Binomial_rational(int=0){fc.emplace_back(1);}voidextend(){intn=fc.size();Rnxt=fc.back()*n;fc.push_back(nxt);}Rfac(intn){if(n<0)return0;while((int)fc.size()<=n)extend();returnfc[n];}Rfinv(intn){if(n<0)return0;returnfac(n).inverse();}Rinv(intn){if(n<0)return-inv(-n);returnR{1,max(n,1)};}RC(intn,intr){if(n<0orr<0orn<r)returnR{0};returnfac(n)*finv(n-r)*finv(r);}Roperator()(intn,intr){returnC(n,r);}template<typenameI>Rmultinomial(constvector<I>&r){static_assert(is_integral<I>::value==true);intn=0;for(auto&x:r){if(x<0)returnR{0};n+=x;}Rres=fac(n);for(auto&x:r)res*=finv(x);returnres;}template<typenameI>Roperator()(constvector<I>&r){returnmultinomial(r);}RP(intn,intr){if(n<0||n<r||r<0)returnR(0);returnfac(n)*finv(n-r);}// [x^r] 1 / (1-x)^nRH(intn,intr){if(n<0||r<0)returnR(0);returnr==0?1:C(n+r-1,r);}};#line 2 "math/rational-fps.hpp"
#line 4 "math/rational-fps.hpp"
template<typenameR=Rational>structFormalPowerSeries_rational:vector<R>{usingvector<R>::vector;usingfps=FormalPowerSeries_rational;fps&operator+=(constfps&r){if(r.size()>this->size())this->resize(r.size());for(inti=0;i<(int)r.size();i++)(*this)[i]+=r[i];return*this;}fps&operator+=(constR&r){if(this->empty())this->resize(1);(*this)[0]+=r;return*this;}fps&operator-=(constfps&r){if(r.size()>this->size())this->resize(r.size());for(inti=0;i<(int)r.size();i++)(*this)[i]-=r[i];return*this;}fps&operator-=(constR&r){if(this->empty())this->resize(1);(*this)[0]-=r;return*this;}fps&operator*=(constfps&r){intn=this->size()+r.size()-1;fpsf(n);for(inti=0;i<(int)this->size();i++){for(intj=0;j<(int)r.size();j++){f[i+j]+=(*this)[i]*r[j];}}return*this=f;}fps&operator*=(constR&v){for(intk=0;k<(int)this->size();k++)(*this)[k]*=v;return*this;}fps&operator/=(constfps&r){if(this->size()<r.size()){this->clear();return*this;}intn=this->size()-r.size()+1;fpsf(*this),g(r);g.shrink();Rcoeff=g.back().inverse();for(auto&x:g)x*=coeff;intdeg=(int)f.size()-(int)g.size()+1;intgs=g.size();fpsquo(deg);for(inti=deg-1;i>=0;i--){quo[i]=f[i+gs-1];for(intj=0;j<gs;j++)f[i+j]-=quo[i]*g[j];}*this=quo*coeff;this->resize(n,R(0));return*this;}fps&operator%=(constfps&r){*this-=*this/r*r;shrink();return*this;}fpsoperator+(constfps&r)const{returnfps(*this)+=r;}fpsoperator+(constR&v)const{returnfps(*this)+=v;}fpsoperator-(constfps&r)const{returnfps(*this)-=r;}fpsoperator-(constR&v)const{returnfps(*this)-=v;}fpsoperator*(constfps&r)const{returnfps(*this)*=r;}fpsoperator*(constR&v)const{returnfps(*this)*=v;}fpsoperator/(constfps&r)const{returnfps(*this)/=r;}fpsoperator%(constfps&r)const{returnfps(*this)%=r;}fpsoperator-()const{fpsret(this->size());for(inti=0;i<(int)this->size();i++)ret[i]=-(*this)[i];returnret;}voidshrink(){while(this->size()&&this->back()==R(0))this->pop_back();}fpsrev()const{fpsret(*this);reverse(begin(ret),end(ret));returnret;}fpsdot(fpsr)const{fpsret(min(this->size(),r.size()));for(inti=0;i<(int)ret.size();i++)ret[i]=(*this)[i]*r[i];returnret;}// 前 sz 項を取ってくる。sz に足りない項は 0 埋めするfpspre(intsz)const{fpsret(begin(*this),begin(*this)+min((int)this->size(),sz));if((int)ret.size()<sz)ret.resize(sz);returnret;}fpsoperator>>(intsz)const{if((int)this->size()<=sz)return{};fpsret(*this);ret.erase(ret.begin(),ret.begin()+sz);returnret;}fpsoperator<<(intsz)const{fpsret(*this);ret.insert(ret.begin(),sz,R(0));returnret;}fpsdiff()const{constintn=(int)this->size();fpsret(max(0,n-1));Rone(1),coeff(1);for(inti=1;i<n;i++){ret[i-1]=(*this)[i]*coeff;coeff+=one;}returnret;}fpsintegral()const{constintn=(int)this->size();fpsret(n+1);for(inti=0;i<n;i++)ret[i+1]=(*this)[i]/(i+1);returnret;}Reval(Rx)const{Rr=0,w=1;for(auto&v:*this)r+=w*v,w*=x;returnr;}fpsinv(intdeg=-1)const{assert((*this)[0]!=R(0));if(deg==-1)deg=(*this).size();fpsret{R(1)/(*this)[0]};for(inti=1;i<deg;i<<=1){ret=(ret+ret-ret*ret*(*this).pre(i<<1)).pre(i<<1);}returnret.pre(deg);}fpslog(intdeg=-1)const{assert(!(*this).empty()&&(*this)[0]==R(1));if(deg==-1)deg=(int)this->size();return(this->diff()*this->inv(deg)).pre(deg-1).integral();}fpsexp(intdeg=-1)const{assert((*this).size()==0||(*this)[0]==R(0));if(deg==-1)deg=(int)this->size();fpsret{R(1)};for(inti=1;i<deg;i<<=1){ret=(ret*(pre(i<<1)+R(1)-ret.log(i<<1))).pre(i<<1);}returnret.pre(deg);}fpspow(int64_tk,intdeg=-1)const{constintn=(int)this->size();if(deg==-1)deg=n;if(k==0){fpsret(deg);if(deg)ret[0]=1;returnret;}for(inti=0;i<n;i++){if((*this)[i]!=R(0)){Rrev=R(1)/(*this)[i];fpsret=(((*this*rev)>>i).log(deg)*k).exp(deg);ret*=(*this)[i].pow(k);ret=(ret<<(i*k)).pre(deg);if((int)ret.size()<deg)ret.resize(deg,R(0));returnret;}if(__int128_t(i+1)*k>=deg)returnfps(deg,R(0));}returnfps(deg,R(0));}};#line 8 "verify/verify-unit-test/rational-number.test.cpp"
//#line 2 "modint/montgomery-modint.hpp"
#line 5 "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};}friendstd::ostream&operator<<(std::ostream&os,constmint&b){returnos<<b.get();}friendstd::istream&operator>>(std::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 "modulo/binomial.hpp"
#line 6 "modulo/binomial.hpp"
usingnamespacestd;// コンストラクタの MAX に 「C(n, r) や fac(n) でクエリを投げる最大の n 」// を入れると倍速くらいになる// mod を超えて前計算して 0 割りを踏むバグは対策済みtemplate<typenameT>structBinomial{vector<T>f,g,h;Binomial(intMAX=0){assert(T::get_mod()!=0&&"Binomial<mint>()");f.resize(1,T{1});g.resize(1,T{1});h.resize(1,T{1});if(MAX>0)extend(MAX+1);}voidextend(intm=-1){intn=f.size();if(m==-1)m=n*2;m=min<int>(m,T::get_mod());if(n>=m)return;f.resize(m);g.resize(m);h.resize(m);for(inti=n;i<m;i++)f[i]=f[i-1]*T(i);g[m-1]=f[m-1].inverse();h[m-1]=g[m-1]*f[m-2];for(inti=m-2;i>=n;i--){g[i]=g[i+1]*T(i+1);h[i]=g[i]*f[i-1];}}Tfac(inti){if(i<0)returnT(0);while(i>=(int)f.size())extend();returnf[i];}Tfinv(inti){if(i<0)returnT(0);while(i>=(int)g.size())extend();returng[i];}Tinv(inti){if(i<0)return-inv(-i);while(i>=(int)h.size())extend();returnh[i];}TC(intn,intr){if(n<0||n<r||r<0)returnT(0);returnfac(n)*finv(n-r)*finv(r);}inlineToperator()(intn,intr){returnC(n,r);}template<typenameI>Tmultinomial(constvector<I>&r){static_assert(is_integral<I>::value==true);intn=0;for(auto&x:r){if(x<0)returnT(0);n+=x;}Tres=fac(n);for(auto&x:r)res*=finv(x);returnres;}template<typenameI>Toperator()(constvector<I>&r){returnmultinomial(r);}TC_naive(intn,intr){if(n<0||n<r||r<0)returnT(0);Tret=T(1);r=min(r,n-r);for(inti=1;i<=r;++i)ret*=inv(i)*(n--);returnret;}TP(intn,intr){if(n<0||n<r||r<0)returnT(0);returnfac(n)*finv(n-r);}// [x^r] 1 / (1-x)^nTH(intn,intr){if(n<0||r<0)returnT(0);returnr==0?1:C(n+r-1,r);}};#line 11 "verify/verify-unit-test/rational-number.test.cpp"
usingmint=LazyMontgomeryModInt<998244353>;//#line 2 "misc/rng.hpp"
#line 7 "misc/rng.hpp"
usingnamespacestd;#line 2 "internal/internal-seed.hpp"
#line 4 "internal/internal-seed.hpp"
usingnamespacestd;namespacenyaan_internal{unsignedlonglongnon_deterministic_seed(){unsignedlonglongm=chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now().time_since_epoch()).count();m^=9845834732710364265uLL;m^=m<<24,m^=m>>31,m^=m<<35;returnm;}unsignedlonglongdeterministic_seed(){return88172645463325252UL;}// 64 bit の seed 値を生成 (手元では seed 固定)// 連続で呼び出すと同じ値が何度も返ってくるので注意// #define RANDOMIZED_SEED するとシードがランダムになるunsignedlonglongseed(){#if defined(NyaanLocal) && !defined(RANDOMIZED_SEED)
returndeterministic_seed();#else
returnnon_deterministic_seed();#endif
}}// namespace nyaan_internal#line 10 "misc/rng.hpp"
namespacemy_rand{usingi64=longlong;usingu64=unsignedlonglong;// [0, 2^64 - 1)u64rng(){staticu64_x=nyaan_internal::seed();return_x^=_x<<7,_x^=_x>>9;}// [l, r]i64rng(i64l,i64r){assert(l<=r);returnl+rng()%u64(r-l+1);}// [l, r)i64randint(i64l,i64r){assert(l<r);returnl+rng()%u64(r-l);}// choose n numbers from [l, r) without overlappingvector<i64>randset(i64l,i64r,i64n){assert(l<=r&&n<=r-l);unordered_set<i64>s;for(i64i=n;i;--i){i64m=randint(l,r+1-i);if(s.find(m)!=s.end())m=r-i;s.insert(m);}vector<i64>ret;for(auto&x:s)ret.push_back(x);sort(begin(ret),end(ret));returnret;}// [0.0, 1.0)doublernd(){returnrng()*5.42101086242752217004e-20;}// [l, r)doublernd(doublel,doubler){assert(l<r);returnl+rnd()*(r-l);}template<typenameT>voidrandshf(vector<T>&v){intn=v.size();for(inti=1;i<n;i++)swap(v[i],v[randint(0,i+1)]);}}// namespace my_randusingmy_rand::randint;usingmy_rand::randset;usingmy_rand::randshf;usingmy_rand::rnd;usingmy_rand::rng;#line 14 "verify/verify-unit-test/rational-number.test.cpp"
usingnamespaceNyaan;voidNyaan::solve(){{Rationala{4,3},b{2,3};assert(a+b==2);assert(a-b==Rational(2,3));assert(a*b==Rational(8,9));assert(a/b==2);assert(a.inverse()==Rational(3,4));assert(a.pow(3)==Rational(64,27));assert((a>b)==true);assert((a>=b)==true);assert((a<b)==false);assert((a<=b)==false);}{Binomial_rational<Rational>C;assert(C.fac(3)==6);assert(C.finv(3)==Rational(1,6));assert(C(4,2)==6);assert(C(vi{3,2})==10);}{usingfps=FormalPowerSeries_rational<Rational>;{fpsf{1,2,{3,2}},g{{1,4},5};fpsh{{5,4},7,{3,2}};assert(f+g==h);h=fps{{3,4},-3,{3,2}};assert(f-g==h);assert(f*g%g==fps{});assert(f*g%f==fps{});}{fpse{1,1,{1,2},{1,6},{1,24},{1,120}};fpsf=e.pow(10);trc(f);rep(i,sz(e)){assert(e[i]*Rational{10}.pow(i)==f[i]);}}}// mint と挙動の比較{autocomp=[&](inti,intj,intk,intl){rep(b,16){intii=(b>>0)%2?-i:+i;intjj=(b>>1)%2?-j:+j;intkk=(b>>2)%2?-k:+k;intll=(b>>3)%2?-l:+l;Rationalx{ii,jj},y{kk,ll};mintX=mint{ii}/jj;mintY=mint{kk}/ll;assert(X+Y==(x+y).to_mint(998244353));assert(X-Y==(x-y).to_mint(998244353));assert(X*Y==(x*y).to_mint(998244353));if(Y!=0){assert(X/Y==(x/y).to_mint(998244353));}}};rep(i,20)rep1(j,20)rep(k,20)rep1(l,20)comp(i,j,k,l);rep(t,10000){intlower=t%2?1:32000;lli=rng(lower,35000);llj=rng(lower,35000);llk=rng(lower,35000);lll=rng(lower,35000);comp(i,j,k,l);}}// binom, mint と挙動の比較{Binomial_rational<Rational>C1;Binomial<mint>C2;reg(i,-15,15){assert(C2.fac(i)==C1.fac(i).to_mint(998244353));assert(C2.finv(i)==C1.finv(i).to_mint(998244353));assert(C2.inv(i)==C1.inv(i).to_mint(998244353));reg(j,-15,15){assert(C2(i,j)==C1(i,j).to_mint(998244353));assert(C2.P(i,j)==C1.P(i,j).to_mint(998244353));if(i+j<20)assert(C2.H(i,j)==C1.H(i,j).to_mint(998244353));}}}cerr<<"OK"<<endl;{ints,t;cin>>s>>t;cout<<s+t<<"\n";}}