ll ex_gcd(ll a, ll b, ll & x, ll & y) {
if(!b) {
x = 1, y = 0;
return a;
}
ll gcd = ex_gcd(b, a % b, x, y);
ll temp = x;
x = y;
y = temp - a / b * y;
return gcd;
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
ll a, b, c, x, y;// ax + by = c;
ll gcd = ex_gcd(a, b, x, y);
if(c % gcd) {
puts("-1");
return 0;
}
//x的最小正解
x *= c / gcd;
b /= gcd;
x = (x % b + b) % b;
printf("%lld\n", x);
//两个不一定同时满足。
//y的最小正解
y *= c / gcd;
a /= gcd;
y = (y % a + a) % a;
return 0;
}
拓展欧几里德算法模板
最新推荐文章于 2022-09-07 00:06:03 发布