軽量modint
code: (cpp)
// MOD は素数を仮定
// 定数倍高速化したい場合は各メソッドに constexpr 属性や const, noexcept を加える
template <ll MOD=998244353>
struct mint {
ll v;
mint(const int x = 0) : v(x % MOD) {}
ll& val() { return v; }
mint operator+(const mint b) { return mint(*this) += b; }
mint operator-(const mint b) { return mint(*this) -= b; }
mint operator*(const mint b) { return mint(*this) *= b; }
mint operator/(const mint b) { return mint(*this) /= b; }
mint& operator+=(const mint b) {
v += b.v;
if (v >= MOD) v -= MOD;
return *this;
}
mint& operator-=(const mint b) {
if (v < b.v) {
v += MOD;
}
v -= b.v;
return *this;
}
mint& operator*=(const mint b) {
v = v * b.v % MOD;
return *this;
}
mint& operator/=(mint b) {
ll exp = MOD - 2;
while (exp) {
if (exp % 2) *this *= b;
b *= b;
exp /= 2;
}
return *this;
}
};