AcWing 203. 同餘方程
阿新 • • 發佈:2022-05-24
一、通過同餘方程通解,算出\(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; }