#pragma once
template<uint64_tm>structModInt64{static_assert(m>=1);usingmint=ModInt64;usingu64=uint64_t;usingu128=__uint128_t;usingi128=__int128_t;public:staticconstexpru64get_mod(){returnm;}staticmintraw(u64v){mintx;x._v=v;returnx;}ModInt64():_v(0){}template<classT,enable_if_t<is_integral_v<T>&&is_signed_v<T>,int>=0>ModInt64(Tv){if(v>=0){_v=u128(v)%m;}else{usingU=make_unsigned_t<T>;Ux=U(-(v+1))+1;u64r=u128(x)%m;_v=r==0?0:m-r;}}template<classT,enable_if_t<is_integral_v<T>&&is_unsigned_v<T>,int>=0>ModInt64(Tv):_v(u128(v)%m){}u64val()const{return_v;}mint&operator++(){_v++;if(_v==m)_v=0;return*this;}mint&operator--(){if(_v==0)_v=m;_v--;return*this;}mintoperator++(int){mintresult=*this;++*this;returnresult;}mintoperator--(int){mintresult=*this;--*this;returnresult;}mint&operator+=(constmint&rhs){u64x=_v+rhs._v;if(x<_v||x>=m)x-=m;_v=x;return*this;}mint&operator-=(constmint&rhs){_v=_v>=rhs._v?_v-rhs._v:m-(rhs._v-_v);return*this;}mint&operator*=(constmint&rhs){_v=u128(_v)*rhs._v%m;return*this;}mint&operator/=(constmint&rhs){return*this*=rhs.inv();}mintoperator+()const{return*this;}mintoperator-()const{returnmint()-*this;}mintpow(longlongn)const{assert(0<=n);mintx=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}returnr;}mintinv()const{u64a=m,b=_v;i128x0=0,x1=1;while(b){u64q=a/b;u64r=a-q*b;a=b;b=r;i128x=x0-i128(q)*x1;x0=x1;x1=x;}if(x0<0)x0+=m/a;returnraw(u64(x0));}friendmintoperator+(constmint&lhs,constmint&rhs){returnmint(lhs)+=rhs;}friendmintoperator-(constmint&lhs,constmint&rhs){returnmint(lhs)-=rhs;}friendmintoperator*(constmint&lhs,constmint&rhs){returnmint(lhs)*=rhs;}friendmintoperator/(constmint&lhs,constmint&rhs){returnmint(lhs)/=rhs;}friendbooloperator==(constmint&lhs,constmint&rhs){returnlhs._v==rhs._v;}friendbooloperator!=(constmint&lhs,constmint&rhs){returnlhs._v!=rhs._v;}friendistream&operator>>(istream&is,mint&x){strings;if(!(is>>s))returnis;boolneg=s[0]=='-';boolsign=neg||s[0]=='+';u64v=0;for(inti=sign;i<int(s.size());i++)v=(u128(v)*10+(s[i]-'0'))%m;x=raw(neg&&v?m-v:v);returnis;}friendostream&operator<<(ostream&os,constmint&x){returnos<<x.val();}private:u64_v;};