6#include "cplib/num/pow.hpp"
20 using int_type = uint64_t;
21 using int_double_t =
unsigned __int128;
22 static constexpr int_type MOD = (int_type(1) << 61) - 1;
32 template <
typename T, std::enable_if_t<std::is_
integral_v<T> && std::is_
signed_v<T>>* =
nullptr>
34 auto r = x % std::make_signed_t<int_type>(MOD);
42 template <
typename T, std::enable_if_t<std::is_
unsigned_v<T>>* =
nullptr>
48 int_type
val()
const {
return val_; }
58 static constexpr int_type
mod() {
return MOD; }
68 mint operator++(
int) {
74 mint operator+()
const {
return *
this; }
76 mint operator+(
const mint& rhs)
const {
77 int_type r = val_ + rhs.val_;
78 return from_raw(r >= MOD ? r - MOD : r);
81 mint& operator+=(
const mint& rhs) {
return *
this = *
this + rhs; }
92 mint operator--(
int) {
98 mint operator-()
const {
return from_raw(val_ == 0 ? 0 : MOD - val_); }
100 mint operator-(
const mint& rhs)
const {
101 int_type r = val_ + MOD - rhs.val_;
102 return from_raw(r >= MOD ? r - MOD : r);
105 mint& operator-=(
const mint& rhs) {
return *
this = *
this - rhs; }
107 mint operator*(
const mint& rhs)
const {
108 int_double_t prod = int_double_t(val_) * rhs.val_;
109 int_type r = (prod >> 61) + (prod & MOD);
110 return from_raw(r >= MOD ? r - MOD : r);
113 mint& operator*=(
const mint& rhs) {
return *
this = *
this * rhs; }
115 mint inv()
const {
return pow(*
this, MOD - 2); }
117 mint operator/(
const mint& rhs)
const {
return *
this * rhs.inv(); }
119 mint& operator/=(
const mint& rhs) {
return *
this *= rhs.inv(); }
121 bool operator==(
const mint& rhs)
const {
return residue() == rhs.residue(); }
123 bool operator!=(
const mint& rhs)
const {
return !(*
this == rhs); }
128 static constexpr mint from_raw(int_type x) {
Modular integer modulo , a Mersenne prime.
Definition: mint2p61m1.hpp:17
int_type val() const
Converts back to a plain integer in the range .
Definition: mint2p61m1.hpp:48
int_type residue() const
Returns a number that is the same for the same residue class modulo the modulus.
Definition: mint2p61m1.hpp:55
static constexpr int_type mod()
Returns the modulus.
Definition: mint2p61m1.hpp:58
ModInt2P61M1(T x)
Converts a plain integer to a Barrett modular integer.
Definition: mint2p61m1.hpp:33
constexpr T pow(T base, uint64_t exp, Op &&op={})
A generic exponetiation by squaring function.
Definition: pow.hpp:14