@@ -12,17 +12,17 @@ namespace cp_algo::math {
12
12
static constexpr size_t bits = sizeof (Int) * 8 ;
13
13
using Int2 = std::conditional_t <bits <= 32 , int64_t , __int128_t >;
14
14
using UInt2 = std::conditional_t <bits <= 32 , uint64_t , __uint128_t >;
15
- static Int mod () {
15
+ constexpr static Int mod () {
16
16
return modint::mod ();
17
17
}
18
- static Int remod () {
18
+ constexpr static Int remod () {
19
19
return modint::remod ();
20
20
}
21
- static UInt2 modmod () {
21
+ constexpr static UInt2 modmod () {
22
22
return UInt2 (mod ()) * mod ();
23
23
}
24
- modint_base () = default ;
25
- modint_base (Int2 rr) {
24
+ constexpr modint_base () = default;
25
+ constexpr modint_base (Int2 rr) {
26
26
to_modint ().setr (UInt ((rr + modmod ()) % mod ()));
27
27
}
28
28
modint inv () const {
@@ -63,10 +63,10 @@ namespace cp_algo::math {
63
63
UInt R = to_modint ().getr ();
64
64
return R - (R > (UInt)mod () / 2 ) * mod ();
65
65
}
66
- void setr (UInt rr) {
66
+ constexpr void setr (UInt rr) {
67
67
r = rr;
68
68
}
69
- UInt getr () const {
69
+ constexpr UInt getr () const {
70
70
return r;
71
71
}
72
72
@@ -85,8 +85,8 @@ namespace cp_algo::math {
85
85
protected:
86
86
UInt r;
87
87
private:
88
- modint& to_modint () {return static_cast <modint&>(*this );}
89
- modint const & to_modint () const {return static_cast <modint const &>(*this );}
88
+ constexpr modint& to_modint () {return static_cast <modint&>(*this );}
89
+ constexpr modint const & to_modint () const {return static_cast <modint const &>(*this );}
90
90
};
91
91
template <typename modint>
92
92
concept modint_type = std::is_base_of_v<modint_base<modint, typename modint::Int>, modint>;
0 commit comments