扩欧这玩意儿暑假就学了,但是一直仅限于背 \(y=\cdots\),背完就忘,于是搞个学习笔记加深印象。
解方程 \(ax+by=\gcd(a,b)\)
设 \(ax_1+by_1=\gcd(a,b)\),\(bx_2+(a\mod b)y_2=\gcd(b,a\mod b)\)。
根据欧几里得算法可知,\(\gcd(a,b)=\gcd(b,a\mod b)\)。
所以 \(ax_1+by_1=bx_2+(a\mod b)y_2\)。
又 \(\begin{aligned}bx_2+(a\mod b)y_2&=bx_2+(a-\left\lfloor\frac{a}{b}\right\rfloor\times b)y_2\\&=b(x_2-\left\lfloor\frac{a}{b}\right\rfloor y_2)+ay_2\end{aligned}\)
又 \(a,b\) 相同,所以 \(x_1=y_2,y_1=x2-\left\lfloor\frac{a}{b}\right\rfloor y_2\)。
\(b=0\) 时 \(x=1,y=0\),递归求解即可。
code:
点击查看代码
int n,m;
int ex_gcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return a;
}
int ret=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return ret;
}
void solve(){
int x,y,ans=ex_gcd(n,m,x,y);
printf("%d %d %d\n",x,y,ans);
}
signed main(){
int t=1;
while(~scanf("%d%d",&n,&m))solve();
}
别问为什么和OI Wiki上的一样,但是我认为自己手打一遍还是记得住的。
标签:lfloor,right,gcd,int,笔记,学习,bx,扩欧,mod From: https://www.cnblogs.com/yinhee/p/Extended_Euclidean_algorithm.html