This documentation is automatically generated by online-judge-tools/verification-helper
#include "math/dynamic_modint.hpp"dynamic_modint::set_mod(u64 p) : $p$ を法とする modint 型を定義する
後は modint と同じ
大体の演算をサポートしている
noshiさんの実装を大いに参考にしている
#pragma once
#include<cstdint>
#include<iostream>
class dynamic_modint {
using u64 = std::uint_fast64_t;
static u64 Modulus;
public:
u64 a;
static void set_mod(u64 m) { Modulus = m; }
u64 &value() { return a; }
dynamic_modint(u64 x = 0) : a(x % Modulus) {}
dynamic_modint operator+(const dynamic_modint rhs) const {
return dynamic_modint(*this) += rhs;
}
dynamic_modint operator-(const dynamic_modint rhs) const {
return dynamic_modint(*this) -= rhs;
}
dynamic_modint operator*(const dynamic_modint rhs) const {
return dynamic_modint(*this) *= rhs;
}
dynamic_modint operator/(const dynamic_modint rhs) const {
return dynamic_modint(*this) /= rhs;
}
dynamic_modint &operator+=(const dynamic_modint rhs) {
a += rhs.a;
if (a >= Modulus) {
a -= Modulus;
}
return *this;
}
dynamic_modint &operator-=(const dynamic_modint rhs) {
if (a < rhs.a) {
a += Modulus;
}
a -= rhs.a;
return *this;
}
dynamic_modint &operator*=(const dynamic_modint rhs) {
a = a * rhs.a % Modulus;
return *this;
}
dynamic_modint &operator/=(dynamic_modint rhs) {
u64 exp = Modulus - 2;
while (exp) {
if (exp % 2) {
*this *= rhs;
}
rhs *= rhs;
exp /= 2;
}
return *this;
}
dynamic_modint& operator++() noexcept {
if (++a == Modulus) a = 0;
return *this;
}
dynamic_modint operator++(int) noexcept {
dynamic_modint tmp(*this);
++(*this);
return tmp;
}
dynamic_modint& operator--() noexcept {
if (a == 0) a = Modulus;
--a;
return *this;
}
dynamic_modint operator--(int) noexcept {
dynamic_modint tmp(*this);
--(*this);
return tmp;
}
friend std::ostream& operator<<(std::ostream& os, const dynamic_modint& rhs) {
os << rhs.a;
return os;
}
};
inline dynamic_modint::u64 dynamic_modint::Modulus = 1;#line 2 "math/dynamic_modint.hpp"
#include<cstdint>
#include<iostream>
class dynamic_modint {
using u64 = std::uint_fast64_t;
static u64 Modulus;
public:
u64 a;
static void set_mod(u64 m) { Modulus = m; }
u64 &value() { return a; }
dynamic_modint(u64 x = 0) : a(x % Modulus) {}
dynamic_modint operator+(const dynamic_modint rhs) const {
return dynamic_modint(*this) += rhs;
}
dynamic_modint operator-(const dynamic_modint rhs) const {
return dynamic_modint(*this) -= rhs;
}
dynamic_modint operator*(const dynamic_modint rhs) const {
return dynamic_modint(*this) *= rhs;
}
dynamic_modint operator/(const dynamic_modint rhs) const {
return dynamic_modint(*this) /= rhs;
}
dynamic_modint &operator+=(const dynamic_modint rhs) {
a += rhs.a;
if (a >= Modulus) {
a -= Modulus;
}
return *this;
}
dynamic_modint &operator-=(const dynamic_modint rhs) {
if (a < rhs.a) {
a += Modulus;
}
a -= rhs.a;
return *this;
}
dynamic_modint &operator*=(const dynamic_modint rhs) {
a = a * rhs.a % Modulus;
return *this;
}
dynamic_modint &operator/=(dynamic_modint rhs) {
u64 exp = Modulus - 2;
while (exp) {
if (exp % 2) {
*this *= rhs;
}
rhs *= rhs;
exp /= 2;
}
return *this;
}
dynamic_modint& operator++() noexcept {
if (++a == Modulus) a = 0;
return *this;
}
dynamic_modint operator++(int) noexcept {
dynamic_modint tmp(*this);
++(*this);
return tmp;
}
dynamic_modint& operator--() noexcept {
if (a == 0) a = Modulus;
--a;
return *this;
}
dynamic_modint operator--(int) noexcept {
dynamic_modint tmp(*this);
--(*this);
return tmp;
}
friend std::ostream& operator<<(std::ostream& os, const dynamic_modint& rhs) {
os << rhs.a;
return os;
}
};
inline dynamic_modint::u64 dynamic_modint::Modulus = 1;