#pragma once
#include<cassert>
#include<ostream>usingnamespacestd;structmodint_2_61m1{usingM=modint_2_61m1;usingu64=unsignedlonglong;usingu128=__uint128_t;staticconstexpru64mod=(1uLL<<61)-1;u64x;staticconstexpru64modulo(u128y){u64val=(y>>61)+(y&mod);returnval>=mod?val-mod:val;}modint_2_61m1():x(0){}modint_2_61m1(longlong_x){longlongy=_x%(longlong)mod;if(y<0)y+=mod;x=y;}staticMraw(u64y){Mres;res.x=y;returnres;}u64get()const{returnx;}staticu64get_mod(){returnmod;}friendMoperator+(constM&l,constM&r){u64y=l.x+r.x;if(y>=mod)y-=mod;returnraw(y);}friendMoperator-(constM&l,constM&r){u64y=l.x-r.x;if(y>=mod)y+=mod;returnraw(y);}friendMoperator*(constM&l,constM&r){returnraw(modulo(u128(l.x)*r.x));}friendMoperator/(constM&l,constM&r){returnl*r.inverse();}M&operator+=(constM&r){return*this=*this+r;}M&operator-=(constM&r){return*this=*this-r;}M&operator*=(constM&r){return*this=*this*r;}M&operator/=(constM&r){return*this=*this/r;}Moperator-()const{returnraw(x?mod-x:u64{0});}Moperator+()const{return*this;}Mpow(u64e)const{Mres{1},a{*this};while(e){if(e&1)res=res*a;a=a*a;e>>=1;}returnres;}Minverse()const{assert(x!=0);returnthis->pow(mod-2);}friendbooloperator==(constM&l,constM&r){returnl.x==r.x;}friendbooloperator!=(constM&l,constM&r){returnl.x!=r.x;}friendostream&operator<<(ostream&os,constM&r){returnos<<r.x;}};