This documentation is automatically generated by online-judge-tools/verification-helper
#include <cstdint>
template <std::uint_fast64_t Modulus> class modint {
using u64 = std::uint_fast64_t;
public:
using value_type = u64;
static constexpr u64 mod = Modulus;
private:
static_assert(mod < static_cast<u64>(1) << 32,
"Modulus must be less than 2**32");
u64 v;
constexpr modint &negate() noexcept {
if (v != 0)
v = mod - v;
return *this;
}
public:
constexpr modint(const u64 x = 0) noexcept : v(x % mod) {}
constexpr u64 &value() noexcept { return v; }
constexpr const u64 &value() const noexcept { return v; }
constexpr modint operator+() const noexcept { return modint(*this); }
constexpr modint operator-() const noexcept { return modint(*this).negate(); }
constexpr modint operator+(const modint rhs) const noexcept {
return modint(*this) += rhs;
}
constexpr modint operator-(const modint rhs) const noexcept {
return modint(*this) -= rhs;
}
constexpr modint operator*(const modint rhs) const noexcept {
return modint(*this) *= rhs;
}
constexpr modint operator/(const modint rhs) const noexcept {
return modint(*this) /= rhs;
}
constexpr modint &operator+=(const modint rhs) noexcept {
v += rhs.v;
if (v >= mod)
v -= mod;
return *this;
}
constexpr modint &operator-=(const modint rhs) noexcept {
if (v < rhs.v)
v += mod;
v -= rhs.v;
return *this;
}
constexpr modint &operator*=(const modint rhs) noexcept {
v = v * rhs.v % mod;
return *this;
}
constexpr modint &operator/=(modint rhs) noexcept {
u64 exp = mod - 2;
while (exp != 0) {
if (exp % 2 != 0)
*this *= rhs;
rhs *= rhs;
exp /= 2;
}
return *this;
}
};
template <std::uint_fast64_t Modulus>
constexpr typename modint<Modulus>::u64 modint<Modulus>::mod;
#line 1 "other/modint.cpp"
#include <cstdint>
template <std::uint_fast64_t Modulus> class modint {
using u64 = std::uint_fast64_t;
public:
using value_type = u64;
static constexpr u64 mod = Modulus;
private:
static_assert(mod < static_cast<u64>(1) << 32,
"Modulus must be less than 2**32");
u64 v;
constexpr modint &negate() noexcept {
if (v != 0)
v = mod - v;
return *this;
}
public:
constexpr modint(const u64 x = 0) noexcept : v(x % mod) {}
constexpr u64 &value() noexcept { return v; }
constexpr const u64 &value() const noexcept { return v; }
constexpr modint operator+() const noexcept { return modint(*this); }
constexpr modint operator-() const noexcept { return modint(*this).negate(); }
constexpr modint operator+(const modint rhs) const noexcept {
return modint(*this) += rhs;
}
constexpr modint operator-(const modint rhs) const noexcept {
return modint(*this) -= rhs;
}
constexpr modint operator*(const modint rhs) const noexcept {
return modint(*this) *= rhs;
}
constexpr modint operator/(const modint rhs) const noexcept {
return modint(*this) /= rhs;
}
constexpr modint &operator+=(const modint rhs) noexcept {
v += rhs.v;
if (v >= mod)
v -= mod;
return *this;
}
constexpr modint &operator-=(const modint rhs) noexcept {
if (v < rhs.v)
v += mod;
v -= rhs.v;
return *this;
}
constexpr modint &operator*=(const modint rhs) noexcept {
v = v * rhs.v % mod;
return *this;
}
constexpr modint &operator/=(modint rhs) noexcept {
u64 exp = mod - 2;
while (exp != 0) {
if (exp % 2 != 0)
*this *= rhs;
rhs *= rhs;
exp /= 2;
}
return *this;
}
};
template <std::uint_fast64_t Modulus>
constexpr typename modint<Modulus>::u64 modint<Modulus>::mod;