扩展欧几里得算法是当已知a和b时,求得一组x和y使得

exgcd学习笔记-LMLPHP

首先,根据数论中的相关定理,解一定存在        //留坑待填

之后我们可以推一推式子

exgcd学习笔记-LMLPHP

将a替换掉

exgcd学习笔记-LMLPHP

展开括号

exgcd学习笔记-LMLPHP

提出b,合并

exgcd学习笔记-LMLPHP

  exgcd学习笔记-LMLPHP

  exgcd学习笔记-LMLPHP

现在已经将原来的式子转化为一个小一点的问题了

当  b = 0 时,则有 x = 1 , y = 0

之后递归回去就可以求得最终的x和y了

整理上面的和可以得到:

exgcd学习笔记-LMLPHP

之后代码就很好写了

int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int res,tmp;
res=exgcd(b,a%b,x,y);
tmp=x;
x=y;
y=tmp-a/b*y;
return res;
}

upd:

  拿一道例题来说事 : 青蛙的约会

05-06 22:25