扩展欧几里得

 1 #define LL long long
 2 int exgcd(LL a,LL b,LL &x,LL &y)/*需要对x和y进行更改,所以要加&*/
 3 {
 4  if(b==0){
 5   x=1;
 6   y=0;
 7   return a;
 8  }
 9  int r=exgcd(b,a%b,x,y);/*递归处理*/
10  int cnt=x;
11  x=y;
12  y=cnt-a/b*y;
13  return r;
14 }

 应用于: ax+by = gcd(a, b) ;

 

有时题目让求的 x 和 y 并不是ax+by = gcd(a, b) 中的x和y,而是ax'+by' =k中的x和y,例如ax'+by' = 1;这是就要对 x 和 y 进行处理,以x为例:


令d=gcd(a,b),把ax+by = gcd(a, b) 的两边同时乘 k/d;这样等式就成了ax'+by' = k(其中x'=xk/d,y'=yk/d);进一步转化:ax'-nab/d+by'+nab/d = k (其中的n代表ab/d的个数) ,得到 a(x'-nb/d)+b(y'+na/d) = k .

那么就可以得出ax'+by' =k的最优解 x' 为    x'%(b/d)  ,即 (x*k/d)%(b/d) ,为了防止结果为负数,可以写成  (x*k/d+b/d)%(b/d)

posted @ 2017-11-02 11:02  Miroerwf_Q  阅读(124)  评论(0编辑  收藏  举报