EX_GCD

先來小力推導一波EX_GCD

(1) : a*x1+b*y1=gcd(a,b)  b*x2+(a%b)*y2=gcd(b,a%b)

可得(2) : a*x1+b*y1=b*x2+(a%b)*y2

因爲 a%b=a-(a/b)*b

在得(3) : a*x1+b*y1=b*x2+(a-(a/b)*b)*y2

所以:(4) : a*x1+b*y1=b*x2+a*y2-(a/b)*b*y2

所以可得  x1=y2 , y1=x2-a/b*y2

這樣就推完了

這樣可以求出 ax+by=gcd(a,b)的一組解(x,y) 如3 10 可求出 -3, 1 ;   6   8可求出-1,1;  5 6 求出 -1 , 1;

這篇講的很好點擊打開鏈接

#include<bits/stdc++.h>
using namespace std;
int a,b,x,y;
inline int ex_gcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	int res=ex_gcd(b,a%b,x,y);
	int oo=x;
	x=y;//x1=y2
	y=oo-(a/b)*y;//這是推出的y1=(x2-(a/b)*y2)
	return res;
}
int main(){
	while(scanf("%d%d",&a,&b)!=EOF){
		x=0;y=0;
		ex_gcd(a,b,x,y);
		printf("%d %d\n",x,y);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章