설명은 나중에 써야겠다.
template<unsigned int P, unsigned int PHI = P - 1>
class Modulo {
private:
long long n;
public:
Modulo() = default;
constexpr Modulo(long long _n) : n(_n >= 0 ? _n % P : (P - (-_n % P)) % P) {}
constexpr Modulo operator+(const Modulo& rhs) const {return Modulo((n + rhs.n) % P);}
constexpr Modulo& operator+=(const Modulo& rhs) {*this = *this + rhs; return *this;}
constexpr Modulo operator-() const {return n == 0 ? Modulo(0) : Modulo(P - n);}
constexpr Modulo operator-(const Modulo& rhs) const {return *this + (-rhs);}
constexpr Modulo& operator-=(const Modulo& rhs) {(*this) = (*this) - rhs; return *this;}
constexpr Modulo operator*(const Modulo& rhs) const {return Modulo((n * rhs.n) % P);}
constexpr Modulo& operator*=(const Modulo& rhs) {(*this) = (*this) * rhs; return *this;}
constexpr Modulo pow(unsigned long long powered) const {
if (powered <= 1) {
return powered == 0 ? 1 : *this;
}
Modulo hold = pow(powered / 2);
if (powered % 2 == 0) {
return hold * hold;
} else {
return hold * hold * (*this);
}
}
[[nodiscard]] constexpr Modulo inverse() const {return this->pow(PHI - 1);}
constexpr Modulo operator/(const Modulo& rhs) const {
if (rhs == 0) {throw std::logic_error("DIV BY ZERO");}
return *this * rhs.inverse();
}
constexpr Modulo& operator/=(const Modulo& rhs) {*this = *this / rhs; return *this;}
constexpr bool operator==(const Modulo& rhs) const {return n == rhs.n;}
explicit operator int() const {return static_cast<int>(n);}
};
'Computer Science' 카테고리의 다른 글
[C++] 다항식 클래스와 라그랑주 보간법(Lagrange Interpolation) 구현 (0) | 2022.08.07 |
---|---|
[C++] SCC Maker class (0) | 2022.08.06 |
[C++] 선분 교차 판정 (0) | 2022.08.04 |
[C++] 유리수 클래스(class Fraction) 구현 (0) | 2022.08.04 |
[C++] AVL Tree와 이를 이용한 Ordered-Set 구현 (0) | 2022.08.04 |
댓글