扩展欧几里得算法,顾名思义,是求gcd(a,b)的拓展。
对于ax+by=gcd(a,b)
我们通过此算法求出一组满足条件的x,y
那么,对于ax+by=c,若c%gcd(a,b)==0,则有且有无数组解,否则无解。
//性质:对于未知数(x,y),ax+by=k*gcd(a,b)
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
int exgcd(int a,int b,int &x1,int &y1){
if(!b)return x1=1,y1=0,a;
int d=exgcd(b,a%b,x1,y1);
int x2=x1,y2=y1;
x1=y2,y1=x2-a/b*y2;
}
/*
ax1+by1=gcd(a,b)
bx2+(a%b)y2=gcd(b,a%b)
ax1+by1=bx2+(a-a/b*b)y2
ax1+by1=ay2+b(x2-a/b*y2)
x1=y2
y1=x2-a/b*y2
*/
/*
1)求解不定方程:
对于:ax+by=c
若c%gcd(a,b)==0,即c为gcd(a,b)的倍数,则存在解,否则不存在整数解
此时通过exgcd(a,b,x,y)仅仅求出了以下解
ax'+by'=gcd(a,b)
真正的解:
x=x'*c/gcd(a,b),y=y'*c/gcd(a,b)
要求最小正整数x:
x=(x'%b+b)%b*c/gcd(a,b)
y同理
2)求逆元
gcd(a,p)=1,贝祖等式ax+py=1存在唯一解
显然x为a的逆元
*/