网上查找其他博主的总结了下:
欧几里德算法停止的状态是: a= gcd , b = 0 ,那么,这是否能给我们求解 x y 提供一种思路呢?因为,这时候,只要 a = gcd 的系数是 1 ,那么只要 b 的系数是 0 或者其他值(无所谓是多少,反正任何数乘以 0 都等于 0 但是a 的系数一定要是 1),这时,我们就会有: a1 + b0 = gcd 当然这是最终状态,但是我们是否可以从最终状态反推到最初的状态呢? 假设当前我们要处理的是求出 a 和 b的最大公约数,并求出 x 和 y 使得 ax + by= gcd ,而我们已经求出了下一个状态:b 和 a%b 的最大公约数,并且求出了一组x1 和y1 使得: bx1 + (a%b)y1 = gcd , 那么这两个相邻的状态之间是否存在一种关系呢? 我们知道: a%b = a - (a/b)b(这里的 “/” 指的是整除,例如 5/2=2 , 1/3=0),那么,我们可以进一步得到: gcd = bx1 + (a-(a/b)b)y1 = bx1 + ay1 – (a/b)by1 = ay1 + b(x1 – a/by1) 对比之前我们的状态:求一组 x 和 y 使得:ax + by = gcd ,是否发现了什么? 这里: x = y1 y = x1 – a/by1
然后
一个遗留问题:我们将要求出来的 x,yx,y 仅仅保证满足 ax + by = 1ax+by=1,而 xx 不一定是最小正整数解。有可能太大,也有可能是负数。这依然可以解决,那就是,xx 批量地减去或加上 bb,能保证 ax + by = 1ax+by=1,因为:ax + by = 1 ax+by=1``ax + by + k×ba - k×ba = 1ax+by+k×ba−k×ba=1a(x+kb) + (y-ka)b = 1a(x+kb)+(y−ka)b=1
- List item`
- #include<bits/stdc++.h>
using namespace std;
long long x,y;
int e_gcd(long long a,long long b){//扩展欧几里得
if(!b){
x=1;
y=0;
return a;
}
long long ans=e_gcd(b,a%b);
long long temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
int main(){
long long a,b;
cin>>a>>b;
e_gcd(a,b);
cout<<(x%b+b)%b<<endl;//处理为最小正整数
return 0;
}插入代码片`