Модульная арифметика
Перейти к навигации
Перейти к поиску
Основные арифметические операции
- (A + B) % MOD = (A % MOD + B % MOD) % MOD
- (A - B) % MOD = ((A % MOD - B % MOD) % MOD + MOD) % MOD
- (A * B) % MOD = ((A % MOD) * (B % MOD)) % MOD
«Деление» и нахождение обратного элемента
- (A / B) % MOD = ((A % MOD) * B-1) % MOD
- Если MOD простой: B-1 = BMOD - 2 % MOD
- Если B и MOD взаимно просты: B-1 = X, где gcdex(B % MOD, MOD, X, Y) == 1
- Если B и MOD не взаимно просты, решения не существует.
class ModInt { long long value; static const long long mod = 1e9 + 7; static long long gcdex(long long a, long long b, long long &x, long long &y) { if (!b) { x = 1; y = 0; return a; } long long x1, y1, d = gcdex(b, a % b, x1, y1); x = y1; y = x1 - a / b * y1; return d; } public: ModInt(long long value = 0) : value((value % mod + mod) % mod) {} ModInt operator + (const ModInt &that) const { return value + that.value; } ModInt operator - (const ModInt &that) const { return value - that.value; } ModInt operator * (const ModInt &that) const { return value * that.value; } ModInt operator / (const ModInt &that) const { long long x, y; gcdex(that.value, mod, x, y); return value * x; } bool canDivide(const ModInt &that) const { long long x, y; return that.value && gcdex(that.value, mod, x, y) == 1; } friend istream &operator >> (istream &in, ModInt &m) { long long value; in >> value; m = ModInt(value); return in; } friend ostream &operator << (ostream &out, const ModInt &m) { return out << m.value; } };
Ссылки
Теория:
- e-maxx.ru — Обратный элемент в кольце по модулю
- cp-algorithms.com — Modular Inverse
- brestprog.by — Операции по модулю
- algorithmica.org — Модульная арифметика, обратный элемент: 1 2 3 4
- usaco.guide — Modular Arithmetics
- codeforces.com — Modular Arithmetic for Beginners
Код: