拓展欧几里得是用来计算已经知道a和b的时候,让你去求a*x+b*y=GCD(a,b)的一组解(x,y)。(首先根据一些相关数论证实,这个解是必定存在的)spa
GCD(a,b)应该都知道吧,求a和b的最小公约数。blog
由于GCD(a,b)=GCD(b,a%b),因此a*x+b*y=GCD(b,a%b),也就意味着a*x+b*y=b*x-(a%b)*y,进而能够得出x*a+y*b=y*a+(x-y*a/b)*b;递归
最后推到最后是当b为0的时候,a为最小公约数,根据第一个式子,a*x+b*y=a;(可是此时的x和y是进过屡次替换过的,并非最开始的那个x,y了)可是咱们能够递归回咱们须要的那个最开始的x,y。这就是拓展欧几里得。string
代码实现:it
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int x,y; int ex_gcd(int a,int b) { int ret,tem; if(!b) { x=1;y=0; return a; } ret=ex_gcd(b,a%b); tem=x; x=y; y=tem-a/b*y; return ret; } int main() { int a,b,z; scanf("%d%d",&a,&b); z=ex_gcd(a,b); printf("%d %d\n",x,y); return 0; }