Skip to content

Commit

Permalink
Use [0, 2*mod) as the standard interval
Browse files Browse the repository at this point in the history
  • Loading branch information
adamant-pwn committed Oct 7, 2024
1 parent 06c33f5 commit b8f1b97
Showing 1 changed file with 10 additions and 22 deletions.
32 changes: 10 additions & 22 deletions cp-algo/number_theory/modint.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,15 @@ namespace cp_algo::math {
}
modint_base(): r(0) {}
modint_base(int64_t rr): r(rr % mod()) {
r = std::min(r, r + mod());
r = std::min(r, r + 2 * mod());
r = m_transform(r);
}
modint inv() const {
return bpow(to_modint(), mod() - 2);
}
modint operator - () const {
modint neg;
neg.r = std::min(-r, mod() - r);
neg.r = std::min(-r, 2 * mod() - r);
return neg;
}
modint& operator /= (const modint &t) {
Expand All @@ -60,36 +60,24 @@ namespace cp_algo::math {
return to_modint();
}
modint& operator += (const modint &t) {
r += t.r; r = std::min(r, r - mod());
r += t.r; r = std::min(r, r - 2 * mod());
return to_modint();
}
modint& operator -= (const modint &t) {
r -= t.r; r = std::min(r, r + mod());
r -= t.r; r = std::min(r, r + 2 * mod());
return to_modint();
}
modint operator + (const modint &t) const {return modint(to_modint()) += t;}
modint operator - (const modint &t) const {return modint(to_modint()) -= t;}
modint operator * (const modint &t) const {return modint(to_modint()) *= t;}
modint operator / (const modint &t) const {return modint(to_modint()) /= t;}
// Why <=> doesn't work?..
auto operator == (const modint_base &t) const {
return std::min(r, r - mod()) == std::min(t.r, t.r - mod());
}
auto operator != (const modint_base &t) const {
return std::min(r, r - mod()) != std::min(t.r, t.r - mod());
}
auto operator <= (const modint_base &t) const {
return std::min(r, r - mod()) <= std::min(t.r, t.r - mod());
}
auto operator >= (const modint_base &t) const {
return std::min(r, r - mod()) >= std::min(t.r, t.r - mod());
}
auto operator < (const modint_base &t) const {
return std::min(r, r - mod()) < std::min(t.r, t.r - mod());
}
auto operator > (const modint_base &t) const {
return std::min(r, r - mod()) > std::min(t.r, t.r - mod());
}
auto operator == (const modint_base &t) const {return getr() == t.getr();}
auto operator != (const modint_base &t) const {return getr() != t.getr();}
auto operator <= (const modint_base &t) const {return getr() <= t.getr();}
auto operator >= (const modint_base &t) const {return getr() >= t.getr();}
auto operator < (const modint_base &t) const {return getr() < t.getr();}
auto operator > (const modint_base &t) const {return getr() > t.getr();}
int64_t rem() const {
uint64_t R = getr();
return 2 * R > (uint64_t)mod() ? R - mod() : R;
Expand Down

0 comments on commit b8f1b97

Please sign in to comment.