扩展欧几里得
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)
转载请注明出处.