@@ -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 Intmod () {
15
+ constexpr static Intmod () {
16
16
return modint::mod ();
17
17
}
18
- static Intremod () {
18
+ constexpr static Intremod () {
19
19
return modint::remod ();
20
20
}
21
- static UInt2modmod () {
21
+ constexpr static UInt2modmod () {
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
modintinv ()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
- UIntgetr ()const {
69
+ constexpr UIntgetr ()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
- modintconst &to_modint ()const {return static_cast <modintconst &>(*this );}
88
+ constexpr modint&to_modint () {return static_cast <modint&>(*this );}
89
+ constexpr modintconst &to_modint ()const {return static_cast <modintconst &>(*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>;