- 2012
T4
- @ 2025-10-3 16:46:53
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
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);
cout << (x % b + b) % b << endl;
return 0;
}
/*
int gcd(int a, int b)
{
if(b == 0) return a;
return gcd(b, a % b);
}
扩展欧几里得用来求 ax + by = gcd(a, b) 的解
当b == 0时, ax + by = a 故此时 x = 1, y = 0
当b != 0时
因为 gcd(a, b) = gcd(b, a % b)
而 bx' + (a % b)y' = gcd(b, a % b);
=> bx' + (a - a / b * b) y' = gcd(b, a % b)
=> ay' + b(x' - a / b*y') = gcd(b, a % b) = gcd(a, b);
x = y' y = (x' - a / b*y)
int exgcd(int a, int b, int &x, int &y)
{
if(b == 0){
x = 1, y = 0;
return a;
}
int x1, y1, gcd;
gcd = exgcd(b, a % b, x1, y1);
x = y1, y = x1 - a / b * y1;
return gcd;
}
int exgcd(int a, int b, int &x, int &y)
{
if(b == 0){
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
对于一般方程 ax + by = c
设d = gcd(a, b) 则其有解当且仅当d | c 时
所以我们一般求出ax + by = gcd(a, b)的解 x0 y0
此时该方程的一个特解为:x' = x0*c/d y' = y0*c/d
通解 = 特解 + 齐次解
齐次解 ax + by = 0的解
通解: x = x' + k*b / d y = y' - k*a/d k为自然数
通解的最小非负整数解为:设t = b/d (x' % t + t) % t;
(x % b + b) % b
本题 ax=b(mod m)
ax = m*(-y) + b;
ax + my = b
-----
ax=b(mod m)
ax = m*(-y) + b;
ax + my = b
当b = 1时 a和m互质时,所求的x即为a的逆元
*/
/*
ax % b = 1 => ax + by = 1;
x = x' + kb;
y = y' - ka;
t = b / 1 = b;
(x'% b + b) % b;
*/
0 条评论
目前还没有评论...