#pragma once
#include <cassert>
#include <cstdint>
#include <cmath>
#include <iostream>
#include <type_traits>
/**
* @brief MersennePrimeNumberModInt (法がメルセンヌ素数のModInt特殊化)
*/namespaceinternal{template<classModHolder>classModInt;constexprintexponentOfMersennePrimeNumber(uint_fast64_tx){if(x==(1ull<<61)-1)return61;if(x==(1ull<<31)-1)return31;if(x==(1ull<<19)-1)return19;if(x==(1ull<<17)-1)return17;if(x==(1ull<<13)-1)return13;if(x==(1ull<<7)-1)return7;if(x==(1ull<<5)-1)return5;if(x==(1ull<<3)-1)return3;if(x==(1ull<<2)-1)return2;return-1;}template<uint_fast64_tMod>structMersennePrimeNumberModHolder{staticconstexpruint_fast64_tmod=Mod;staticconstexpruint32_texp=exponentOfMersennePrimeNumber(Mod);static_assert(exponentOfMersennePrimeNumber(Mod)!=-1,"Mod value is not a mersenne prime number.");};template<uint_fast64_tMod>classModInt<MersennePrimeNumberModHolder<Mod>>{private:usingu64=uint_fast64_t;usingi64=int_fast64_t;usinglargeUint=std::conditional<Mod<(1ull<<31),u64,__uint128_t>;usingModHolder=MersennePrimeNumberModHolder<Mod>;u64value;public:constexprinlineModInt()noexcept:value(0){}constexprinlineModInt(i64v)noexcept:value(ModInt::normalized(v)){}staticconstexprinlineconstModIntraw(u64v)noexcept{ModIntret;ret.value=v;returnret;}staticconstexprModIntnullopt()noexcept{returnModInt::raw(Mod);}constexprboolisNull()constnoexcept{return*this==ModInt::nullopt();}staticconstexprinlineu64mod()noexcept{returnModHolder::mod;}template<classT>constexprexplicitoperatorT()constnoexcept{returnstatic_cast<T>(value);}constexpru64val()constnoexcept{returnvalue;}constexprModInt&operator+=(constModInt&rhs)noexcept{if((value+=rhs.value)>=mod())value-=mod();return*this;}constexprModInt&operator-=(constModInt&rhs)noexcept{if(value<rhs.value)value+=mod();value-=rhs.value;return*this;}constexprModInt&operator*=(constModInt&rhs)noexcept{value=mul(value,rhs.value);return*this;}constexprModInt&operator/=(constModInt&rhs)noexcept{return*this*=rhs.inv();}constexprconstModIntinv()constnoexcept{returnModInt(ModInt::inverse(value,mod()));}constexprconstModIntoperator+()constnoexcept{return*this;}constexprconstModIntoperator-()constnoexcept{returnModInt(-static_cast<i64>(value));}constexprconstModIntpow(i64expv)constnoexcept{u64ret=1,square=value;for(u64p=std::abs(expv);p;p>>=1){if(p&1)ret=mul(ret,square);square=mul(square,square);}return(expv<0)?(ModInt::raw(1)/ModInt::raw(ret)):ModInt::raw(ret);}friendconstexprbooloperator==(constModInt&lhs,constModInt&rhs)noexcept{returnlhs.value==rhs.value;}friendconstexprbooloperator!=(constModInt&lhs,constModInt&rhs)noexcept{returnlhs.value!=rhs.value;}friendconstexprconstModIntoperator+(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)+=rhs;}friendconstexprconstModIntoperator-(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)-=rhs;}friendconstexprconstModIntoperator*(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)*=rhs;}friendconstexprconstModIntoperator/(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)/=rhs;}friendstd::ostream&operator<<(std::ostream&os,constModInt&x){#ifdef LOCAL_DEBUG
if(x.isNull())returnos<<"{nullopt}";#endif
returnos<<x.value;}friendstd::istream&operator>>(std::istream&is,ModInt&x){is>>x.value;x.value=ModInt::normalized(x.value);returnis;}private:staticconstexprinlineu64applyMod_u64(u64x)noexcept{x=(x>>ModHolder::exp)+(x&mod());if(x>=mod())x-=mod();returnx;}staticconstexprinlineu64applyMod_largeUint(largeUintx)noexcept{u64y=static_cast<u64>(x>>ModHolder::exp)+static_cast<u64>(x&mod());if(y>=mod())y-=mod();returny;}staticconstexprinlineu64mul(u64a,u64b)noexcept{returnapplyMod_largeUint(static_cast<largeUint>(a)*static_cast<largeUint>(b));}staticconstexpru64normalized(i64n)noexcept{if(n>=0)returnapplyMod_u64(n);if(n<-mod())n%=mod();returnn+=mod();}staticconstexpri64inverse(i64a,i64m)noexcept{i64u=0,v=1;while(a!=0){constautot=m/a;static_cast<void>(m-=t*a),std::swap(m,a);static_cast<void>(u-=t*v),std::swap(u,v);}assert(m==1);returnu;}};}// namespace internaltemplate<uint_fast64_tMod>usingMersennePrimeNumberModInt=internal::ModInt<internal::MersennePrimeNumberModHolder<Mod>>;usingModInt_2pow61_1=MersennePrimeNumberModInt<(1ull<<61)-1>;
#line 2 "Math/Modulo/mersenne-prime-number-mod-int.hpp"
#include <cassert>
#include <cstdint>
#include <cmath>
#include <iostream>
#include <type_traits>
/**
* @brief MersennePrimeNumberModInt (法がメルセンヌ素数のModInt特殊化)
*/namespaceinternal{template<classModHolder>classModInt;constexprintexponentOfMersennePrimeNumber(uint_fast64_tx){if(x==(1ull<<61)-1)return61;if(x==(1ull<<31)-1)return31;if(x==(1ull<<19)-1)return19;if(x==(1ull<<17)-1)return17;if(x==(1ull<<13)-1)return13;if(x==(1ull<<7)-1)return7;if(x==(1ull<<5)-1)return5;if(x==(1ull<<3)-1)return3;if(x==(1ull<<2)-1)return2;return-1;}template<uint_fast64_tMod>structMersennePrimeNumberModHolder{staticconstexpruint_fast64_tmod=Mod;staticconstexpruint32_texp=exponentOfMersennePrimeNumber(Mod);static_assert(exponentOfMersennePrimeNumber(Mod)!=-1,"Mod value is not a mersenne prime number.");};template<uint_fast64_tMod>classModInt<MersennePrimeNumberModHolder<Mod>>{private:usingu64=uint_fast64_t;usingi64=int_fast64_t;usinglargeUint=std::conditional<Mod<(1ull<<31),u64,__uint128_t>;usingModHolder=MersennePrimeNumberModHolder<Mod>;u64value;public:constexprinlineModInt()noexcept:value(0){}constexprinlineModInt(i64v)noexcept:value(ModInt::normalized(v)){}staticconstexprinlineconstModIntraw(u64v)noexcept{ModIntret;ret.value=v;returnret;}staticconstexprModIntnullopt()noexcept{returnModInt::raw(Mod);}constexprboolisNull()constnoexcept{return*this==ModInt::nullopt();}staticconstexprinlineu64mod()noexcept{returnModHolder::mod;}template<classT>constexprexplicitoperatorT()constnoexcept{returnstatic_cast<T>(value);}constexpru64val()constnoexcept{returnvalue;}constexprModInt&operator+=(constModInt&rhs)noexcept{if((value+=rhs.value)>=mod())value-=mod();return*this;}constexprModInt&operator-=(constModInt&rhs)noexcept{if(value<rhs.value)value+=mod();value-=rhs.value;return*this;}constexprModInt&operator*=(constModInt&rhs)noexcept{value=mul(value,rhs.value);return*this;}constexprModInt&operator/=(constModInt&rhs)noexcept{return*this*=rhs.inv();}constexprconstModIntinv()constnoexcept{returnModInt(ModInt::inverse(value,mod()));}constexprconstModIntoperator+()constnoexcept{return*this;}constexprconstModIntoperator-()constnoexcept{returnModInt(-static_cast<i64>(value));}constexprconstModIntpow(i64expv)constnoexcept{u64ret=1,square=value;for(u64p=std::abs(expv);p;p>>=1){if(p&1)ret=mul(ret,square);square=mul(square,square);}return(expv<0)?(ModInt::raw(1)/ModInt::raw(ret)):ModInt::raw(ret);}friendconstexprbooloperator==(constModInt&lhs,constModInt&rhs)noexcept{returnlhs.value==rhs.value;}friendconstexprbooloperator!=(constModInt&lhs,constModInt&rhs)noexcept{returnlhs.value!=rhs.value;}friendconstexprconstModIntoperator+(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)+=rhs;}friendconstexprconstModIntoperator-(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)-=rhs;}friendconstexprconstModIntoperator*(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)*=rhs;}friendconstexprconstModIntoperator/(constModInt&lhs,constModInt&rhs)noexcept{returnModInt(lhs)/=rhs;}friendstd::ostream&operator<<(std::ostream&os,constModInt&x){#ifdef LOCAL_DEBUG
if(x.isNull())returnos<<"{nullopt}";#endif
returnos<<x.value;}friendstd::istream&operator>>(std::istream&is,ModInt&x){is>>x.value;x.value=ModInt::normalized(x.value);returnis;}private:staticconstexprinlineu64applyMod_u64(u64x)noexcept{x=(x>>ModHolder::exp)+(x&mod());if(x>=mod())x-=mod();returnx;}staticconstexprinlineu64applyMod_largeUint(largeUintx)noexcept{u64y=static_cast<u64>(x>>ModHolder::exp)+static_cast<u64>(x&mod());if(y>=mod())y-=mod();returny;}staticconstexprinlineu64mul(u64a,u64b)noexcept{returnapplyMod_largeUint(static_cast<largeUint>(a)*static_cast<largeUint>(b));}staticconstexpru64normalized(i64n)noexcept{if(n>=0)returnapplyMod_u64(n);if(n<-mod())n%=mod();returnn+=mod();}staticconstexpri64inverse(i64a,i64m)noexcept{i64u=0,v=1;while(a!=0){constautot=m/a;static_cast<void>(m-=t*a),std::swap(m,a);static_cast<void>(u-=t*v),std::swap(u,v);}assert(m==1);returnu;}};}// namespace internaltemplate<uint_fast64_tMod>usingMersennePrimeNumberModInt=internal::ModInt<internal::MersennePrimeNumberModHolder<Mod>>;usingModInt_2pow61_1=MersennePrimeNumberModInt<(1ull<<61)-1>;