21concept ModInt = is_base_of_v<internal::modint::modint_base, T>;
23concept StaticModInt = is_base_of_v<internal::modint::static_modint_base, T>;
25template <auto mod = 998244353, enable_if_t<(mod >= 1),
nullptr_t> =
nullptr>
26 requires signed_integral<
decltype(mod)> &&
27 internal::type_traits::is_64bit_or_less_v<
decltype(mod)>
30 using M =
decltype(mod);
31 using UM = make_unsigned_t<M>;
32 using BM = internal::type_traits::safely_multipliable_t<M>;
38 static constexpr M
imod() {
return mod; }
39 static constexpr UM
umod() {
return mod; }
49 template <
internal::concepts::broadly_
signed_
integral T>
58 template <
internal::concepts::broadly_
unsigned_
integral T>
61 constexpr UM
val()
const {
return v; }
65 return raw(v == 0 ? 0 :
imod() - v);
108 v = (BM)v * o.v %
umod();
112 return *
this *= o.
inv();
158 return !(*
this == o);
181 static constexpr int imod() {
return bt.umod(); }
182 static constexpr unsigned int umod() {
return bt.umod(); }
192 template <
internal::concepts::broadly_
signed_
integral T>
194 long long x = a %
imod();
201 template <
internal::concepts::broadly_
unsigned_
integral T>
204 constexpr unsigned int val()
const {
return v; }
207 return raw(v == 0 ? 0 :
imod() - v);
255 return *
this *= o.
inv();
295 return !(*
this == o);
internal::math::barrett dynamic_modint< id >::bt(998244353)
constexpr T inv_gcd(T x, T mod)
Definition extended_gcd.hpp:12
constexpr bool is_prime(T n)
Definition primality_test.hpp:44
constexpr dynamic_modint & operator-=(const dynamic_modint &o)
Definition modint.hpp:242
constexpr dynamic_modint & operator*=(const dynamic_modint &o)
Definition modint.hpp:249
constexpr dynamic_modint & operator+=(const dynamic_modint &o)
Definition modint.hpp:235
constexpr bool operator==(const dynamic_modint &o) const
Definition modint.hpp:293
friend constexpr istream & operator>>(istream &is, dynamic_modint &o)
Definition modint.hpp:298
friend constexpr dynamic_modint operator-(const dynamic_modint &l, const dynamic_modint &r)
Definition modint.hpp:277
constexpr dynamic_modint inv() const
Definition modint.hpp:270
static void set_mod(int mod)
Definition modint.hpp:177
constexpr dynamic_modint & operator--()
Definition modint.hpp:217
constexpr unsigned int val() const
Definition modint.hpp:204
constexpr dynamic_modint operator--(int)
Definition modint.hpp:229
constexpr dynamic_modint pow(long long p) const
Definition modint.hpp:258
static constexpr unsigned int umod()
Definition modint.hpp:182
friend constexpr dynamic_modint operator+(const dynamic_modint &l, const dynamic_modint &r)
Definition modint.hpp:272
friend constexpr ostream & operator<<(ostream &os, const dynamic_modint &o)
Definition modint.hpp:304
constexpr dynamic_modint operator-() const
Definition modint.hpp:206
constexpr dynamic_modint()
Definition modint.hpp:190
constexpr dynamic_modint & operator/=(const dynamic_modint &o)
Definition modint.hpp:254
friend constexpr dynamic_modint operator/(const dynamic_modint &l, const dynamic_modint &r)
Definition modint.hpp:287
constexpr dynamic_modint operator++(int)
Definition modint.hpp:224
constexpr bool operator!=(const dynamic_modint &o) const
Definition modint.hpp:294
static constexpr dynamic_modint raw(int a)
Definition modint.hpp:184
constexpr dynamic_modint operator+() const
Definition modint.hpp:205
constexpr dynamic_modint(T a)
Definition modint.hpp:193
friend constexpr dynamic_modint operator*(const dynamic_modint &l, const dynamic_modint &r)
Definition modint.hpp:282
constexpr dynamic_modint & operator++()
Definition modint.hpp:210
static constexpr int imod()
Definition modint.hpp:181
friend constexpr static_modint operator*(const static_modint &l, const static_modint &r)
Definition modint.hpp:145
M mod_type
Definition modint.hpp:36
constexpr static_modint & operator+=(const static_modint &o)
Definition modint.hpp:93
constexpr static_modint operator-() const
Definition modint.hpp:64
constexpr static_modint & operator--()
Definition modint.hpp:75
constexpr static_modint operator++(int)
Definition modint.hpp:82
constexpr static_modint operator--(int)
Definition modint.hpp:87
static constexpr M imod()
Definition modint.hpp:38
static constexpr bool is_prime_mod
Definition modint.hpp:35
constexpr static_modint & operator/=(const static_modint &o)
Definition modint.hpp:111
constexpr bool operator!=(const static_modint &o) const
Definition modint.hpp:157
constexpr static_modint & operator++()
Definition modint.hpp:68
constexpr static_modint inv() const
Definition modint.hpp:127
friend constexpr istream & operator>>(istream &is, static_modint &o)
Definition modint.hpp:161
constexpr UM val() const
Definition modint.hpp:61
friend constexpr static_modint operator-(const static_modint &l, const static_modint &r)
Definition modint.hpp:140
friend constexpr static_modint operator/(const static_modint &l, const static_modint &r)
Definition modint.hpp:150
friend constexpr ostream & operator<<(ostream &os, const static_modint &o)
Definition modint.hpp:167
UM umod_type
Definition modint.hpp:37
static constexpr UM umod()
Definition modint.hpp:39
constexpr static_modint(T a)
Definition modint.hpp:50
constexpr static_modint & operator-=(const static_modint &o)
Definition modint.hpp:100
constexpr static_modint pow(long long p) const
Definition modint.hpp:115
constexpr static_modint & operator*=(const static_modint &o)
Definition modint.hpp:107
static constexpr static_modint raw(M a)
Definition modint.hpp:41
constexpr static_modint()
Definition modint.hpp:47
constexpr static_modint operator+() const
Definition modint.hpp:63
constexpr bool operator==(const static_modint &o) const
Definition modint.hpp:156
friend constexpr static_modint operator+(const static_modint &l, const static_modint &r)
Definition modint.hpp:135