@@ -25,16 +25,15 @@ namespace cp_algo::math {
25
25
return modint::pw128 ();
26
26
}
27
27
static uint64_t m_reduce (__uint128_t ab) {
28
- if (mod () % 2 == 0 ) {
28
+ if (mod () % 2 == 0 ) [[unlikely]] {
29
29
return ab % mod ();
30
30
} else {
31
31
uint64_t m = ab * imod ();
32
- int64_t res = (ab + __uint128_t (m) * mod ()) >> 64 ;
33
- return res < mod () ? res : res - mod ();
32
+ return (ab + __uint128_t (m) * mod ()) >> 64 ;
34
33
}
35
34
}
36
35
static uint64_t m_transform (uint64_t a) {
37
- if (mod () % 2 == 0 ) {
36
+ if (mod () % 2 == 0 ) [[unlikely]] {
38
37
return a;
39
38
} else {
40
39
return m_reduce (a * pw128 ());
@@ -72,7 +71,25 @@ namespace cp_algo::math {
72
71
modint operator - (const modint &t) const {return modint (to_modint ()) -= t;}
73
72
modint operator * (const modint &t) const {return modint (to_modint ()) *= t;}
74
73
modint operator / (const modint &t) const {return modint (to_modint ()) /= t;}
75
- auto operator <=> (const modint_base &t) const = default ;
74
+ // Why <=> doesn't work?..
75
+ auto operator == (const modint_base &t) const {
76
+ return std::min (r, r - mod ()) == std::min (t.r , t.r - mod ());
77
+ }
78
+ auto operator != (const modint_base &t) const {
79
+ return std::min (r, r - mod ()) != std::min (t.r , t.r - mod ());
80
+ }
81
+ auto operator <= (const modint_base &t) const {
82
+ return std::min (r, r - mod ()) <= std::min (t.r , t.r - mod ());
83
+ }
84
+ auto operator >= (const modint_base &t) const {
85
+ return std::min (r, r - mod ()) >= std::min (t.r , t.r - mod ());
86
+ }
87
+ auto operator < (const modint_base &t) const {
88
+ return std::min (r, r - mod ()) < std::min (t.r , t.r - mod ());
89
+ }
90
+ auto operator > (const modint_base &t) const {
91
+ return std::min (r, r - mod ()) > std::min (t.r , t.r - mod ());
92
+ }
76
93
int64_t rem () const {
77
94
uint64_t R = getr ();
78
95
return 2 * R > (uint64_t )mod () ? R - mod () : R;
@@ -89,7 +106,10 @@ namespace cp_algo::math {
89
106
return to_modint ();
90
107
}
91
108
void setr (uint64_t rr) {r = m_transform (rr);}
92
- uint64_t getr () const {return m_reduce (r);}
109
+ uint64_t getr () const {
110
+ uint64_t res = m_reduce (r);
111
+ return std::min (res, res - mod ());
112
+ }
93
113
void setr_direct (uint64_t rr) {r = rr;}
94
114
uint64_t getr_direct () const {return r;}
95
115
private:
0 commit comments