@@ -41,15 +41,15 @@ namespace cp_algo::math {
41
41
}
42
42
modint_base (): r(0 ) {}
43
43
modint_base (int64_t rr): r(rr % mod()) {
44
- r = std::min (r, r + mod ());
44
+ r = std::min (r, r + 2 * mod ());
45
45
r = m_transform (r);
46
46
}
47
47
modint inv () const {
48
48
return bpow (to_modint (), mod () - 2 );
49
49
}
50
50
modint operator - () const {
51
51
modint neg;
52
- neg.r = std::min (-r, mod () - r);
52
+ neg.r = std::min (-r, 2 * mod () - r);
53
53
return neg;
54
54
}
55
55
modint& operator /= (const modint &t) {
@@ -60,36 +60,24 @@ namespace cp_algo::math {
60
60
return to_modint ();
61
61
}
62
62
modint& operator += (const modint &t) {
63
- r += t.r ; r = std::min (r, r - mod ());
63
+ r += t.r ; r = std::min (r, r - 2 * mod ());
64
64
return to_modint ();
65
65
}
66
66
modint& operator -= (const modint &t) {
67
- r -= t.r ; r = std::min (r, r + mod ());
67
+ r -= t.r ; r = std::min (r, r + 2 * mod ());
68
68
return to_modint ();
69
69
}
70
70
modint operator + (const modint &t) const {return modint (to_modint ()) += t;}
71
71
modint operator - (const modint &t) const {return modint (to_modint ()) -= t;}
72
72
modint operator * (const modint &t) const {return modint (to_modint ()) *= t;}
73
73
modint operator / (const modint &t) const {return modint (to_modint ()) /= t;}
74
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
- }
75
+ auto operator == (const modint_base &t) const {return getr () == t.getr ();}
76
+ auto operator != (const modint_base &t) const {return getr () != t.getr ();}
77
+ auto operator <= (const modint_base &t) const {return getr () <= t.getr ();}
78
+ auto operator >= (const modint_base &t) const {return getr () >= t.getr ();}
79
+ auto operator < (const modint_base &t) const {return getr () < t.getr ();}
80
+ auto operator > (const modint_base &t) const {return getr () > t.getr ();}
93
81
int64_t rem () const {
94
82
uint64_t R = getr ();
95
83
return 2 * R > (uint64_t )mod () ? R - mod () : R;
0 commit comments