Skip to content

Commit b8f1b97

Browse files
committed
Use [0, 2*mod) as the standard interval
1 parent 06c33f5 commit b8f1b97

File tree

1 file changed

+10
-22
lines changed

1 file changed

+10
-22
lines changed

cp-algo/number_theory/modint.hpp

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ namespace cp_algo::math {
4141
}
4242
modint_base(): r(0) {}
4343
modint_base(int64_t rr): r(rr % mod()) {
44-
r = std::min(r, r + mod());
44+
r = std::min(r, r + 2 * mod());
4545
r = m_transform(r);
4646
}
4747
modint inv() const {
4848
return bpow(to_modint(), mod() - 2);
4949
}
5050
modint operator - () const {
5151
modint neg;
52-
neg.r = std::min(-r, mod() - r);
52+
neg.r = std::min(-r, 2 * mod() - r);
5353
return neg;
5454
}
5555
modint& operator /= (const modint &t) {
@@ -60,36 +60,24 @@ namespace cp_algo::math {
6060
return to_modint();
6161
}
6262
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());
6464
return to_modint();
6565
}
6666
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());
6868
return to_modint();
6969
}
7070
modint operator + (const modint &t) const {return modint(to_modint()) += t;}
7171
modint operator - (const modint &t) const {return modint(to_modint()) -= t;}
7272
modint operator * (const modint &t) const {return modint(to_modint()) *= t;}
7373
modint operator / (const modint &t) const {return modint(to_modint()) /= t;}
7474
// 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();}
9381
int64_t rem() const {
9482
uint64_t R = getr();
9583
return 2 * R > (uint64_t)mod() ? R - mod() : R;

0 commit comments

Comments
 (0)