aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Wang2020-06-21 10:28:19 -0500
committerGitHub2020-06-21 10:28:19 -0500
commit9c5ee5e0b2666825d181309ecd0a72d83c069020 (patch)
tree7f63589c5e1b4bd60ef8fb4103ba3569653a50cc
parent9094eb40f6ab4785035c8e438d49b1ba8bdf5959 (diff)
Create mi.cpp
-rw-r--r--Miscellaneous/mi.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/Miscellaneous/mi.cpp b/Miscellaneous/mi.cpp
new file mode 100644
index 0000000..6a70e16
--- /dev/null
+++ b/Miscellaneous/mi.cpp
@@ -0,0 +1,43 @@
+struct mi {
+ typedef decay<decltype(MOD)>::type T;
+ /// don't silently convert to T
+ T v; explicit operator T() const { return v; }
+ mi() { v = 0; }
+ mi(ll _v) {
+ v = (-MOD < _v && _v < MOD) ? _v : _v % MOD;
+ if (v < 0) v += MOD;
+ }
+ friend bool operator==(const mi& a, const mi& b) {
+ return a.v == b.v; }
+ friend bool operator!=(const mi& a, const mi& b) {
+ return !(a == b); }
+ friend bool operator<(const mi& a, const mi& b) {
+ return a.v < b.v; }
+ friend void re(mi& a) { ll x; re(x); a = mi(x); }
+ friend str ts(mi a) { return ts(a.v); }
+
+ mi& operator+=(const mi& m) {
+ if ((v += m.v) >= MOD) v -= MOD;
+ return *this; }
+ mi& operator-=(const mi& m) {
+ if ((v -= m.v) < 0) v += MOD;
+ return *this; }
+ mi& operator*=(const mi& m) {
+ v = (ll)v*m.v%MOD; return *this; }
+ mi& operator/=(const mi& m) { return (*this) *= inv(m); }
+ friend mi pow(mi a, ll p) {
+ mi ans = 1; assert(p >= 0);
+ for (; p; p /= 2, a *= a) if (p&1) ans *= a;
+ return ans;
+ }
+ friend mi inv(const mi& a) { assert(a.v != 0);
+ return pow(a,MOD-2); }
+
+ mi operator-() const { return mi(-v); }
+ mi& operator++() { return *this += 1; }
+ mi& operator--() { return *this -= 1; }
+ friend mi operator+(mi a, const mi& b) { return a += b; }
+ friend mi operator-(mi a, const mi& b) { return a -= b; }
+ friend mi operator*(mi a, const mi& b) { return a *= b; }
+ friend mi operator/(mi a, const mi& b) { return a /= b; }
+};