扩展Gcd含义及用途

来源:互联网 发布:tensorflow vgg 微调 编辑:程序博客网 时间:2024/06/07 22:52

扩展Gcd的用途:举个样例,一个人一次走 3步 或 5步 求他到 15步的所有方案:Gcd(3,5) = a*3 + b*5
还比如:Poj的青蛙约会

公式:a*x+b*y = Gcd(a,b)   =   Gcd(b,a%b) = b*x+(a%b)*y = b*x+(a-a/b*b)*y = b*x+a*y-b*a/b*y = a*y+b*(x-a/b*y)根据上面的公式 我们可以得到:x = y1 ; y = x1-a/b*y1 所以 在每次递归后 都要进行 如上式转换。而要注意的是:此递归的过程是 先一直执行上半步骤,深入最后,到达递归的出口 然后返回上一层 执行下半步骤 执行之后,返回值再返回上一层,执行下一步骤,再返回上一层,一直到返回到第一层为止 此过程 就相当于 一条路 一直靠右 走到尽头,然后再回头 靠左返回原点 

怎么说呢,递归嘛,本来就不是人理解的东西,所以把问题想简单,先是 普通Gcd 再进行公式交换 ,简单点想 Exgcd不就是这样嘛

代码如下:

*/

#include<bits/stdc++.h>int x,y;int ExGcd(int n,int m){    if(m==0){//出口条件         x=1;y=0;// n*1+m*0 == Gcd(n,0) 所以出口条件的 x1 y0         return n;    }    int Gcd=ExGcd(m,n%m);//注意 一定要有变量 接收 Gcd     int temp=x;//交换 公式关系     x=y;    y=temp-n/m*y;    return Gcd; }int main(){    int N,M;    scanf("%d %d",&N,&M);    int D=ExGcd(N,M);    printf("x = %d y = %d Gcd(%d,%d) = %d\n",x,y,N,M,D);    return 0;} 
0 0
原创粉丝点击