#include<bits/stdc++.h>
using namespace std;
#define LL=long long;
LL gcd(int a,int b) //gcd
{
return b?a:gcd(b,a%b);
}
LL exgcd1(int a,int b,int &x,int &y ) //方法一
{
if(b==0)
{
x==1;
y==0;
return a;
}
int r=exgcd1(a,b,x,y);
int temp=x;
x=y;
y=temp-(a/b)*y;
return r;
}
LL exgcd2(int a,int b,int &x,int &y) //方法二
{
if(b==0)
{
x=1;
y=0;
return a;
}
int r=exgcd2(b,a%b,y,x);
int t=y;
y=y-(a/b)*x;
x=t;
return r;
}
方法一和二原理相同,
设 ax+by=gcd(a,b);
bx1+(a mod b)y1=gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
则:ax+by=bx1+(a mod b)y1;
即:ax+by=bx1+(a-(a/b)*b)y1=ay1+bx1-(a/b)*by1;
根据恒等定理得:x=y1; y=x1-(a/b)*y1;
不同在于一个在传参的时候没有交换,一个在传参时交换,x,y也相应变化。