1. 程式人生 > 其它 >AcWing 203. 同餘方程

AcWing 203. 同餘方程

題目傳送門

一、通過同餘方程通解,算出\(X\)的最小正整數解

上面的通解$\displaystyle x =x_0+ \frac{b}{gcd(a,b)} *k $

本題\(gcd(a,b)=1\)

所以
$\displaystyle x =x_0+ b *k $

由裴蜀定理知道,\(x\)\(b\)的倍數,
最後我們要把\(x\)拉到最小整數,所以:\((b + x \% b) \% b\)
如果\(x\)比最小整數大,則\(x \% b\)
如果\(x\)是很很小的負數,\(x \% b\)\(x\)拉到\((-b, b)\)之間, 然後再\(+b\)就變成最小整數。

二、實現程式碼

#include <bits/stdc++.h>

using namespace std;

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() {
    int a, b;
    cin >> a >> b;

    int x, y;
    exgcd(a, b, x, y);

    //寫法1:
    cout << (x % b + b) % b << endl;

    //寫法2:
    // if (b < 0) b = -b;
    // int ans = x % b;
    // while (ans <= 0) ans += b;
    // cout << ans << endl;
    return 0;
}