Нахождение обратного элемента по простому модулю (малая теорема Ферма)
a, mod = map(int, input().split())
a %= mod
def bin_pow(a, b):
if b == 0:
return 1 % mod
if b % 2 == 0:
x = bin_pow(a, b // 2)
return (x * x) % mod
else:
return (a * bin_pow(a, b - 1)) % mod
def mod_inverse(x):
return bin_pow(x, mod - 2)
if a == 0:
print(-1)
else:
print(mod_inverse(a))
#include <bits/stdc++.h>
using namespace std;
long long bin_pow(long long a, long long b, long long mod) {
long long res = 1;
while (b > 0) {
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
int main() {
long long a, mod;
cin >> a >> mod;
a %= mod;
if (a == 0) {
cout << -1 << endl;
return 0;
}
cout << bin_pow(a, mod - 2, mod) << endl;
return 0;
}
Отсюда следует, что обратный элемент к a по модулю p равен:
Алгоритм возведения числа в степень за O(log n):
Временная сложность: O(log mod)
Ввод: a mod — число и модуль (простое число)
Вывод: обратный элемент или -1, если a кратно модулю
3 7
Обратный элемент к 3 по модулю 7: 3·5 = 15 ≡ 1 (mod 7) → 5
Вывод: 5