Update include.hh
Signed-off-by: subcrip <contact@subc.rip>
This commit is contained in:
parent
55aa2cddd4
commit
7ab47acfad
31
include.hh
31
include.hh
|
@ -1,6 +1,4 @@
|
||||||
#ifdef ONLINE_JUDGE
|
|
||||||
#pragma GCC optimize("Ofast")
|
#pragma GCC optimize("Ofast")
|
||||||
#endif
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
/**
|
/**
|
||||||
* Useful Macros
|
* Useful Macros
|
||||||
|
@ -300,4 +298,33 @@ int period(string s) { // find the length of shortest recurring period
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* modular arithmetic */
|
||||||
|
template <ll mdl> struct MLL {
|
||||||
|
ll val;
|
||||||
|
MLL(ll v = 0) : val(mod(v, mdl)) {}
|
||||||
|
MLL(const MLL<mdl>& other) : val(other.val) {}
|
||||||
|
friend MLL operator+(const MLL& lhs, const MLL& rhs) { return mod(lhs.val + rhs.val, mdl); }
|
||||||
|
friend MLL operator-(const MLL& lhs, const MLL& rhs) { return mod(lhs.val - rhs.val, mdl); }
|
||||||
|
friend MLL operator*(const MLL& lhs, const MLL& rhs) { return mod(lhs.val * rhs.val, mdl); }
|
||||||
|
friend MLL operator/(const MLL& lhs, const MLL& rhs) { return mod(lhs.val * mod(inverse(rhs.val, mdl), mdl), mdl); }
|
||||||
|
friend MLL operator%(const MLL& lhs, const MLL& rhs) { return mod(lhs.val - (lhs / rhs).val, mdl); }
|
||||||
|
friend bool operator==(const MLL& lhs, const MLL& rhs) { return lhs.val == rhs.val; }
|
||||||
|
friend bool operator!=(const MLL& lhs, const MLL& rhs) { return lhs.val != rhs.val; }
|
||||||
|
void operator+=(const MLL& rhs) { val = (*this + rhs).val; }
|
||||||
|
void operator-=(const MLL& rhs) { val = (*this - rhs).val; }
|
||||||
|
void operator*=(const MLL& rhs) { val = (*this * rhs).val; }
|
||||||
|
void operator/=(const MLL& rhs) { val = (*this / rhs).val; }
|
||||||
|
void operator%=(const MLL& rhs) { val = (*this % rhs).val; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <ll mdl>
|
||||||
|
ostream& operator<<(ostream& out, const MLL<mdl>& num) {
|
||||||
|
return out << num.val;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <ll mdl>
|
||||||
|
istream& operator>>(istream& in, MLL<mdl>& num) {
|
||||||
|
return in >> num.val;
|
||||||
|
}
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue