拓展欧几里得算法
ax+by=gcd(a,b)
∵ gcd(a,b) = gcd(b,a%b)
∴ ax1+by1 = bx2+(a%b)y2
则 ax1+by1 = bx2+(a-a/b*b)y2
拆开后整理可得:
∴ ax1+by1 = ay2+b(x2-a/b*y2)
∴ x1=y2 y1=(x2-a/b*y2)
当b==0时,ax+by = gcd(a,b) = a
∴ x=1 , y=0;
算法模板
#include<iostream>
#include<cstdlib>
using namespace std;
int x,y;
int hijk(int a,int b,int &x,int &y)
{
int yy;
if(!b)
{
x=1;y=0;
return a;
}
int s=hijk(b,a%b,x,y);
yy=y;
y=(x-a/b*y);
x=yy;
/*
s=hijk((b,a%b,y,x);
y-=a/b*x;
*/
//下面注释掉的这种写法是错误的,千万不要写成这种,其实只要把递归过程搞清楚,把式子列出来逻辑关系就能看出来
/*
x=y;
y=(x-a/b*y);
*/
return s;
}
int main()
{
int a,b,g;
while(cin>>a>>b)
{
hijk(a,b,x,y);
cout<<x<<" "<<y<<endl;
}
return 0;
}