# 同余方程

题目链接: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
上次更新:: 3/4/2025, 5:49:45 PM
@2021-2025 代码随想录 版权所有 粤ICP备19156078号