Code
#include <iostream>
using namespace std;
template <int MOD>
struct modint {
int val;
static int norm(const int& x) { return x < 0 ? x + MOD : x; }
modint inv() const {
int a = val, b = MOD, u = 1, v = 0, t;
while (b > 0) t = a / b, swap(a -= t * b, b), swap(u -= t * v, v);
return modint(u);
}
modint() : val(0) {}
modint(const int& m) : val(norm(m % MOD)) {}
modint(const long long& m) : val(norm(m % MOD)) {}
modint operator-() const { return modint(norm(-val)); }
bool operator==(const modint& o) const { return val == o.val; }
bool operator!=(const modint &o) const { return val != o.val; }
bool operator<(const modint& o) const { return val < o.val; }
bool operator>(const modint& o) const { return val > o.val; }
bool operator<=(const modint& o) const { return val <= o.val; }
bool operator>=(const modint& o) const { return val >= o.val; }
modint& operator++() { return *this += 1; }
modint operator++(int) { modint temp = *this; ++(*this); return temp; }
modint& operator--() { return *this -= 1; }
modint operator--(int) { modint temp = *this; --(*this); return temp; }
modint& operator+=(const modint& o) { return val = (1ll * val + o.val) % MOD, *this; }
modint& operator-=(const modint& o) { return val = norm(1ll * val - o.val), *this; }
modint& operator*=(const modint& o) { return val = static_cast<int>(1ll * val * o.val % MOD), *this; }
modint& operator/=(const modint& o) { return *this *= o.inv(); }
modint& operator^=(const modint& o) { return val ^= o.val, *this; }
modint& operator>>=(const modint& o) { return val >>= o.val, *this; }
modint& operator<<=(const modint& o) { return val <<= o.val, *this; }
modint operator-(const modint& o) const { return modint(*this) -= o; }
modint operator+(const modint& o) const { return modint(*this) += o; }
modint operator*(const modint& o) const { return modint(*this) *= o; }
modint operator/(const modint& o) const { return modint(*this) /= o; }
modint operator^(const modint& o) const { return modint(*this) ^= o; }
modint operator>>(const modint& o) const { return modint(*this) >>= o; }
modint operator<<(const modint& o) const { return modint(*this) <<= o; }
friend std::istream& operator>>(std::istream& is, modint& a) {
long long v;
return is >> v, a.val = norm(v % MOD), is;
}
friend std::ostream& operator<<(std::ostream& os, const modint& a) { return os << a.val; }
friend std::string tostring(const modint& a) { return std::to_string(a.val); }
template <class T>
friend modint qpow(const modint& a, const T& b) {
modint x = a, res = 1;
for (T p = b; p; x *= x, p >>= 1)
if (p & 1) res *= x;
return res;
}
};
Usage
先声明:
using Z = modint</*题目给的模数 P*/>;
然后即可把 Z
当成 int
使用,就不需要再写取模了.
求
a
b
m
o
d
P
a^b \bmod P
abmodP 用 qpow(a, b)
.
求
a
a
a 的逆元用 a.inv()
.
输入输出可以直接用 cin
和 cout
.