Решение системы сравнений x ≡ a (mod n), x ≡ b (mod m)
a, b, n, m = map(int, input().split())
def gcd_extended(a, b):
if a == 0:
return b, 0, 1
g, x1, y1 = gcd_extended(b % a, a)
x = y1 - (b // a) * x1
y = x1
return g, x, y
def mod_inverse(a, m):
g, x, y = gcd_extended(a, m)
return (x % m + m) % m
inv_n = mod_inverse(n, m)
x = (a + n * (((b - a) * inv_n) % m)) % (n * m)
print(x)
#include <bits/stdc++.h>
using namespace std;
tuple<long long, long long, long long> gcd_extended(long long a, long long b) {
if (a == 0) return {b, 0, 1};
auto [g, x1, y1] = gcd_extended(b % a, a);
long long x = y1 - (b / a) * x1;
long long y = x1;
return {g, x, y};
}
long long mod_inverse(long long a, long long m) {
auto [g, x, y] = gcd_extended(a, m);
return (x % m + m) % m;
}
int main() {
long long a, b, n, m;
cin >> a >> b >> n >> m;
long long inv_n = mod_inverse(n, m);
long long x = (a + n * (((b - a) * inv_n) % m)) % (n * m);
cout << x << endl;
return 0;
}
Для системы сравнений:
где n и m взаимно просты, существует единственное решение по модулю n·m.
Решение находится по формуле:
где n⁻¹ — обратный элемент к n по модулю m.
Сложность: O(log min(n, m))
Ввод: a b n m — система x ≡ a (mod n), x ≡ b (mod m)
Вывод: решение x (по модулю n·m)
1 2 3 5
x ≡ 1 (mod 3), x ≡ 2 (mod 5) → x = 7 (7 mod 3 = 1, 7 mod 5 = 2)
Вывод: 7