牛客 同余方程

题意:

求关于x 的同余方程$ax ≡ 1 (mod b)$的最小正整数解(保证一定有解)。

思路:

$ax ≡ 1 (mod b)$存在$y$使得$ax + by = 1$,则利用扩欧求出一组解$(x_0, y_0)$。

根据扩欧性质,其余解为$x = x_0 + k * frac{b}{d}, y = y_0 - k * frac{a}{d}$,其中$d = gcd(a, b)$。

已知方程一定有解,$d$一定为1因此$x$的最小正整数解为 $x = (x % b + b) % b$

Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

ll exgcd(ll a, ll b, ll &x, ll &y){
    if(!b){
        x = 1, y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main(){
    ll a, b;
    cin >> a >> b;
    
    ll x, y;
    ll g = exgcd(a, b, x, y);
    
    g = b ;
    x %= g;
    if(x <= 0){
        x += g;
    }
    
    cout << x << endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/jungu/p/13412031.html