# 同余方程
题目链接:https://kamacoder.com/problempage.php?pid=1236
我们需要求出满足以下条件的最小正整数 x:ax≡1 (mod b)
这意味着我们需要找到 x 使得 ax 除以 b 的余数是 1。这个问题实际上是一个典型的 模反元素 问题。
解题思路:
- 为了求出最小的 x,我们可以使用 扩展欧几里得算法 来求出 a 对模 b 的逆元。
- 这个算法能够求解 ax + by = gcd(a, b) 的一组整数解 (x, y),而在 gcd(a, b) = 1 的情况下,x 即为所求的模逆元。
- 扩展欧几里得算法:扩展欧几里得算法可以通过递归或者迭代的方式实现。
下面给出C++代码实现:
#include <iostream>
using namespace std;
// 扩展欧几里得:计算 ax + by = gcd(a, b) 的解
long long extended_gcd(long long a, long long b, long long &x, long long &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
long long x1, y1;
long long gcd = extended_gcd(b, a % b, x1, y1);
x = y1;
y = x1 - (a / b) * y1;
return gcd;
}
int main() {
long long a, b;
cin >> a >> b;
long long x, y;
long long gcd = extended_gcd(a, b, x, y);
// 由于我们只需要模 b 的正整数解,所以我们要保证 x 是正数
x = (x % b + b) % b;
cout << x << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@2021-2025 代码随想录 版权所有 粤ICP备19156078号