#pragma once
#include<utility>structModint61{usingll=longlong;staticconstexprllMOD=(1LL<<61)-1;llv;Modint61(constllx=0):v(x){if(v<0||v>=MOD){v%=MOD;if(v<0)v+=MOD;}}staticModint61raw(llv){Modint61x;x.v=v;returnx;}private:template<intd>staticconstexprstd::pair<ll,ll>divide(constll&a){return{a>>d,a&((1LL<<d)-1)};}public:Modint61pow(longlongk){Modint61res(1),tmp(v);while(k){if(k&1)res*=tmp;tmp*=tmp;k>>=1;}returnres;}Modint61inv(){returnpow(MOD-2);}Modint61&operator+=(Modint61a){v+=a.v;if(v>=MOD)v-=MOD;return*this;}Modint61&operator-=(Modint61a){v+=MOD-a.v;if(v>=MOD)v-=MOD;return*this;}Modint61&operator*=(Modint61a){constauto[vu,vd]=divide<31>(v);constauto[au,ad]=divide<31>(a.v);llx=vd*au+vu*ad;constauto[xu,xd]=divide<30>(x);v=vu*au*2+xu+(xd<<31)+vd*ad;if(v>=MOD){constauto[vu2,vd2]=divide<61>(v);v=vu2+vd2;}if(v>=MOD)v-=MOD;return*this;}Modint61&operator/=(Modint61a){return(*this)*=a.inv();}Modint61operator+(Modint61a)const{returnModint61(v)+=a;}Modint61operator-(Modint61a)const{returnModint61(v)-=a;}Modint61operator*(Modint61a)const{returnModint61(v)*=a;}Modint61operator/(Modint61a)const{returnModint61(v)/=a;}Modint61operator+()const{return*this;}Modint61operator-()const{returnv?Modint61(MOD-v):Modint61(v);}booloperator==(constModint61a)const{returnv==a.v;}booloperator!=(constModint61a)const{returnv!=a.v;}booloperator<(constModint61a)const{returnv<a.v;}};