exgcd

对数论一无所知的我一开始连式子都看不懂,然后去网上找这个式子的含义。 其实就是说ax%b=1(a,b一定要互质,不然无解的) ax=by+1 ax-by=1 ax+by=1 因为a,b互质,所以ax+by=gcd(a,b)
对于方程ax + by = gcd(a, b);我们设解为x, y
我们令a = b, b = a % b;

得到方程bx + (a % b)y = gcd(b, a % b);

由欧几里得算法可以得到gcd(a, b) = gcd(b, (a % b));

代入可得:bx +( a % b )y = gcd(a, b)

设此方程解为x1, y1;

在计算机中我们知道: a % b = a - (a / b) * b;

代入方程化解得:

ay1 + b(x1 - (a / b) y1) = gcd(a, b);

与ax + by = gcd(a, b) 联立,我们很容易得:

x = y1, y = x1- (a / b)y1

然后我们就这样可以解出来了。

明显要用递归来推这个式子的解,当b=0 时,只有x=1,y=0才能使a1+b0=gcd(a,0)

由此我们把ax + by = 1的其中一组解解出来了, 仅仅是其中一组解。

按着这个意思我们就可以写出exgcd的代码了!!!

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

however
这个方程的x是会解出负解的,然而我们要求的是最小正整数解,我们将如何应对!!?? 从别处学到了这种操作,如下

printf("%d",(x+b)%b);
没错,输出答案就这样输出就行了 原题 P1082 (一个晚上加上同学的解释才稍微搞懂了一些,然而感觉还是半懂不懂的,还要继续理解啊.....)

原文地址:https://www.cnblogs.com/--840-114/p/13435904.html