题意:
求关于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; }