乘法逆元
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a×x(modm),则称 x 为 b 的模 m 乘法逆元,记为 b−1(modm)。
b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,bm−2 即为 b 的乘法逆元。
代码实现
方法一:采用快速幂的方式
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL quick_mod (int a, int n, int mod) {
LL res = 1;
while (n) {
if (n & 1) res = (res * a) % mod;
a = (LL) a * a % mod;
n >>= 1;
}
return res;
}
int main() {
int n;
cin >> n;
while (n --) {
int a, b;
cin >> a >> b;
if (a % b == 0) printf("impossible\n");
else printf("%d\n", quick_mod(a, b - 2, b));
}
return 0;
}
方法二:采用扩展欧几里得的方法
#include <iostream>
using namespace std;
typedef long long LL;
int n;
int exgcd(int a, int b, int &x, int &y)
{
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main()
{
cin >> n;
while (n --)
{
int a, p, x, y;
// if (a < p) swap(a, p);
cin >> a >> p;
int d = exgcd(a, p, x, y);
if (d == 1) cout << ((LL)x + p) % p << endl;//保证x是正数
else puts("impossible");
}
return 0;
}
···