zoukankan      html  css  js  c++  java
  • 算法笔记——拓展欧几里得定理

    ax1+by1=gcd(a,b)ax_1+by_1=gcd(a,b)

    bx2+(amodb)y2=gcd(b,amodb)bx_2+(amod b)y_2=gcd(b,a mod b)

    gcd(a,b)=gcd(b,amodb) herefore gcd(a,b)=gcd(b,a mod b)

    ax1+by1=bx2+(amodb)y2ecause ax_1+by_1=bx_2+(amod b)y_2

    amodb=aab×b herefore a mod b=a-lfloorfrac{a}{b} floor imes b

    ax1+by1=bx2+(aab×b)y2ecause ax_1+by_1=bx_2+(a-lfloorfrac{a}{b} floor imes b)y_2

    我们利用乘法分配律,把这个式子展开

    bx2+(aab×b)y2=bx2+ay2ab×by2bx_2+(a-lfloorfrac{a}{b} floor imes b)y_2=bx_2+ay_2-lfloorfrac{a}{b} floor imes by_2

    然后,我们把 bb 提出来

    bx2+ay2ab×by2=ay2b(x2ab×y2)bx_2+ay_2-lfloorfrac{a}{b} floor imes by_2=ay_2-b(x_2-lfloorfrac{a}{b} floor imes y_2)

    然后,我们发现 x1=y2,y1=x2ab×y2x_1=y_2,y_1=x_2-lfloorfrac{a}{b} floor imes y_2

    这样,代码就好写了。

    int exgcd(int a,int b,int &x,int &y){
        if(!b){
            x=1;
            y=0;
            return a;
        }
        int d=exgcd(b,a%b,x,y);
        int t=x;
        x=y;
        y=t-a/b*y;
        return d;
    }
    
  • 相关阅读:
    安装mysql
    工坊第十天
    工坊第九天
    友链qaq
    About me
    好耶
    [Ynoi2011]初始化
    [Ynoi2013]大学
    [Ynoi2015]盼君勿忘
    [Ynoi2019模拟赛]Yuno loves sqrt technology III
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12817029.html
Copyright © 2011-2022 走看看