zoukankan      html  css  js  c++  java
  • 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 (一个晚上加上同学的解释才稍微搞懂了一些,然而感觉还是半懂不懂的,还要继续理解啊.....)

  • 相关阅读:
    RPA浏览器及word需要注意的点
    捕获alert弹框
    创建文件夹
    Excel 筛选功能
    RPA_播放语音
    flask路由
    python操作git
    RPA_关键词识别
    初始flask
    RPA中需要注意的问题
  • 原文地址:https://www.cnblogs.com/--840-114/p/13435904.html
Copyright © 2011-2022 走看看