扩欧学习笔记

扩欧这玩意儿暑假就学了,但是一直仅限于背 \(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上的一样,但是我认为自己手打一遍还是记得住的。

posted @ 2023-01-18 23:42  yinhee  阅读(26)  评论(0)    收藏  举报