#pragma once
namespacemodint998244353{usingi32=int32_t;usingu32=uint32_t;usingu64=uint64_t;constexpru32mod=998244353;constexpru32r=3296722945u;constexpru32n2=932051910;static_assert(r*mod==1,"invalid, r * mod != 1");static_assert(mod<(1<<30),"invalid, mod >= 2 ^ 30");static_assert((mod&1)==1,"invalid, mod % 2 == 0");structMontgomeryModInt998244353{usingmint=MontgomeryModInt998244353;u32a;MontgomeryModInt998244353():a(0){}MontgomeryModInt998244353(constint64_t&b):a(reduce(u64(b%mod+mod)*n2)){};staticu32reduce(constu64&b){return(b+u64(u32(b)*u32(-r))*mod)>>32;}mint&operator+=(constmint&b){if(i32(a+=b.a-2*mod)<0)a+=2*mod;return*this;}mint&operator-=(constmint&b){if(i32(a-=b.a)<0)a+=2*mod;return*this;}mint&operator*=(constmint&b){a=reduce(u64(a)*b.a);return*this;}mint&operator/=(constmint&b){*this*=b.inverse();return*this;}mintoperator+(constmint&b)const{returnmint(*this)+=b;}mintoperator-(constmint&b)const{returnmint(*this)-=b;}mintoperator*(constmint&b)const{returnmint(*this)*=b;}mintoperator/(constmint&b)const{returnmint(*this)/=b;}booloperator==(constmint&b)const{return(a>=mod?a-mod:a)==(b.a>=mod?b.a-mod:b.a);}booloperator!=(constmint&b)const{return(a>=mod?a-mod:a)!=(b.a>=mod?b.a-mod:b.a);}mintoperator-()const{returnmint()-mint(*this);}mintpow(u64n)const{mintret(1),mul(*this);while(n>0){if(n&1)ret*=mul;mul*=mul;n>>=1;}returnret;}mintinverse()const{returnpow(mod-2);}friendostream&operator<<(ostream&os,constmint&b){returnos<<b.get();}friendistream&operator>>(istream&is,mint&b){int64_tt;is>>t;b=mint(t);return(is);}u32get()const{u32ret=reduce(a);returnret>=mod?ret-mod:ret;}staticconstexpru32get_mod(){returnmod;}};}// namespace modint998244353usingmodint998244353::MontgomeryModInt998244353;
#line 2 "modint/modint-cpp11.hpp"
namespacemodint998244353{usingi32=int32_t;usingu32=uint32_t;usingu64=uint64_t;constexpru32mod=998244353;constexpru32r=3296722945u;constexpru32n2=932051910;static_assert(r*mod==1,"invalid, r * mod != 1");static_assert(mod<(1<<30),"invalid, mod >= 2 ^ 30");static_assert((mod&1)==1,"invalid, mod % 2 == 0");structMontgomeryModInt998244353{usingmint=MontgomeryModInt998244353;u32a;MontgomeryModInt998244353():a(0){}MontgomeryModInt998244353(constint64_t&b):a(reduce(u64(b%mod+mod)*n2)){};staticu32reduce(constu64&b){return(b+u64(u32(b)*u32(-r))*mod)>>32;}mint&operator+=(constmint&b){if(i32(a+=b.a-2*mod)<0)a+=2*mod;return*this;}mint&operator-=(constmint&b){if(i32(a-=b.a)<0)a+=2*mod;return*this;}mint&operator*=(constmint&b){a=reduce(u64(a)*b.a);return*this;}mint&operator/=(constmint&b){*this*=b.inverse();return*this;}mintoperator+(constmint&b)const{returnmint(*this)+=b;}mintoperator-(constmint&b)const{returnmint(*this)-=b;}mintoperator*(constmint&b)const{returnmint(*this)*=b;}mintoperator/(constmint&b)const{returnmint(*this)/=b;}booloperator==(constmint&b)const{return(a>=mod?a-mod:a)==(b.a>=mod?b.a-mod:b.a);}booloperator!=(constmint&b)const{return(a>=mod?a-mod:a)!=(b.a>=mod?b.a-mod:b.a);}mintoperator-()const{returnmint()-mint(*this);}mintpow(u64n)const{mintret(1),mul(*this);while(n>0){if(n&1)ret*=mul;mul*=mul;n>>=1;}returnret;}mintinverse()const{returnpow(mod-2);}friendostream&operator<<(ostream&os,constmint&b){returnos<<b.get();}friendistream&operator>>(istream&is,mint&b){int64_tt;is>>t;b=mint(t);return(is);}u32get()const{u32ret=reduce(a);returnret>=mod?ret-mod:ret;}staticconstexpru32get_mod(){returnmod;}};}// namespace modint998244353usingmodint998244353::MontgomeryModInt998244353;