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);
	}
}

阅读更多
文章标签: 数论
个人分类: 讲课
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭