#pragma once
// mod (2^127-1)structModIntM127{usingmint=ModIntM127;usingu64=unsignedlonglong;usingu128=__uint128_t;staticconstexprintB=127;staticconstexpru128M=(u128(1)<<B)-1;staticconstexprintH=64;staticconstexpru128MASK_LOW=(u128(1)<<H)-1;staticconstexpru128MASK_HIGH=(u128(1)<<(B-H))-1;public:staticconstexpru128get_mod(){returnM;}staticmintraw(intv){mintx;x._v=v;returnx;}ModIntM127():_v(0){}ModIntM127(intv):_v(v<0?M+v:v){}ModIntM127(longlongv):_v(v<0?M+v:v){}ModIntM127(unsignedlonglongv):_v(v){}ModIntM127(u128v):_v(calc_mod(v)){}u128val()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){_v+=rhs._v;if(_v>=M)_v-=M;return*this;}mint&operator-=(constmint&rhs){_v-=rhs._v;if(_v>=M)_v+=M;return*this;}mint&operator*=(constmint&rhs){u128lo1=_v&MASK_LOW,hi1=_v>>H;u128lo2=rhs._v&MASK_LOW,hi2=rhs._v>>H;_v=hi1*hi2;_v=((_v&MASK_HIGH)<<H)+(_v>>(B-H));_v+=calc_mod(lo1*hi2+hi1*lo2);_v=((_v&MASK_HIGH)<<H)+(_v>>(B-H));_v+=calc_mod(lo1*lo2);_v=calc_mod(_v);return*this;}mint&operator/=(constmint&rhs){return*this=*this*rhs.inv();}mintoperator+()const{return*this;}mintoperator-()const{returnmint()-*this;}mintpow(u128n)const{mintx=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}returnr;}mintinv()const{assert(_v);returnpow(M-2);}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;}private:u128_v;u128calc_mod(u128v){u128x=(v&M)+(v>>B);if(x>=M)x-=M;returnx;}};
#line 2 "modint/modint-m127.hpp"
// mod (2^127-1)structModIntM127{usingmint=ModIntM127;usingu64=unsignedlonglong;usingu128=__uint128_t;staticconstexprintB=127;staticconstexpru128M=(u128(1)<<B)-1;staticconstexprintH=64;staticconstexpru128MASK_LOW=(u128(1)<<H)-1;staticconstexpru128MASK_HIGH=(u128(1)<<(B-H))-1;public:staticconstexpru128get_mod(){returnM;}staticmintraw(intv){mintx;x._v=v;returnx;}ModIntM127():_v(0){}ModIntM127(intv):_v(v<0?M+v:v){}ModIntM127(longlongv):_v(v<0?M+v:v){}ModIntM127(unsignedlonglongv):_v(v){}ModIntM127(u128v):_v(calc_mod(v)){}u128val()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){_v+=rhs._v;if(_v>=M)_v-=M;return*this;}mint&operator-=(constmint&rhs){_v-=rhs._v;if(_v>=M)_v+=M;return*this;}mint&operator*=(constmint&rhs){u128lo1=_v&MASK_LOW,hi1=_v>>H;u128lo2=rhs._v&MASK_LOW,hi2=rhs._v>>H;_v=hi1*hi2;_v=((_v&MASK_HIGH)<<H)+(_v>>(B-H));_v+=calc_mod(lo1*hi2+hi1*lo2);_v=((_v&MASK_HIGH)<<H)+(_v>>(B-H));_v+=calc_mod(lo1*lo2);_v=calc_mod(_v);return*this;}mint&operator/=(constmint&rhs){return*this=*this*rhs.inv();}mintoperator+()const{return*this;}mintoperator-()const{returnmint()-*this;}mintpow(u128n)const{mintx=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}returnr;}mintinv()const{assert(_v);returnpow(M-2);}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;}private:u128_v;u128calc_mod(u128v){u128x=(v&M)+(v>>B);if(x>=M)x-=M;returnx;}};