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;
    }
    
  • 相关阅读:
    定时器工厂
    无聊js画了个菱形
    盒模型之滚动条
    无聊,纯css写了个评分鼠标移入的效果
    json属性名为什么要双引号?
    原生js写的一个简单slider
    D2 前端技术论坛总结(上)
    第一天,入坑 —— 2014.10.24
    获取div相对文档的位置
    我们平时是怎么写html和css的?
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12817029.html
Copyright © 2011-2022 走看看