• 欧几里得学习笔记


    GCD

    \(gcd(x,y)=gcd(x,y-x)\)

    int GCD(int x,int y){return y? x:GCD(y,x%y);}
    

    EXGCD

    扩展欧几里得用于求一组特解 \((x,y)\) 使得 \(ax+by=(a,b)\)

    \(\because ax+by=(a,b)\)

    \(\therefore ax+by=(b,a\bmod b)=bx+(a\bmod b)y=bx+(a-\lfloor\frac{a}{b}\rfloor b)\times y=ay+(x-\lfloor \frac{a}{b} \rfloor y) \times b\)

    \(ax+by=ay+(x-\lfloor \frac{a}{b} \rfloor y) \times b\)

    所以只要每次递归进行以下操作

    inline ll exgcd(ll a,ll b,ll &x,ll &y){
        if(!b){x=1,y=0; return a;}
        ll ret=exgcd(b,a%b,y,x); y-=a/b*x;
        return ret;
    }
    

    求逆元

    \(a\times x \equiv 1\pmod b\),且 \(gcd(a,b)=1\),则称 \(x\)\(a\) 的逆元,记为 \(a^{-1}\)

    可以用扩展欧几里得求解。

    LL inv(int a,int mod){
        LL x,y;
        LL tmp=exgcd(a,mod,x,y);
        return tmp==1?(x%mod+mod)%mod:-1;
    }
    

    线性处理

    \(p=k\times i+r\),则有 \(k\times i+r \equiv 0 \pmod p\)

    \(k\times r^{-1}+i^{-1} \equiv 0 \pmod p\)

    \(i^{-1} \equiv -k\times r^{-1} \pmod p\)

    \(i^{-1} \equiv -[\frac{p}{i}]\times (p \bmod i)^{-1} \pmod p\)

    inv[i]=-(p/i)*inv[p%i];
    

    求解线性同余方程

    1.对于方程 \(a\times x + b\times y=c\),该方程等价于 \(a\times x \equiv c \pmod b\),有解的充分必要条件是 $gcd(a,b)|c $$

    2.若 \(gcd(a,b)=1\),且 \(x_0,y_0\)\(a\times x+b\times y=c\) 的一组特解。

    则该方程的任意解可以表示为 \(x=x_0+b\times t\)\(y=y_0-a\times t\)

    特别的,若要求最小非负整数 \(x\) , 则令 \(t=\frac{b}{gcd(a,b)}\),再令 \(x=(x\bmod t+t)\bmod t\)

    bool solve(int a,int b,int c,int &x,int &y){
        int d=exgcd(a,b,x,y);
        if(c%d) return false;
        int k=c/d;
        x*=k;y*=k;
        return true;
    }
    
  • 相关阅读:
    vue.extend 拓展
    leetcode-166-分数到小数(用余数判断有没有出现小数的循环体)
    leetcode-165-比较版本号
    leetcode-162-寻找峰值
    vector.clear()不能用来清零
    leetcode-209-长度最小的子数组
    leetcode-201-数字范围按位与
    完全多部图的判断(个人思考)
    leetcode-200-岛屿的个数(dfs找所有的连通分量)
    leetcode-151-翻转字符串里的单词
  • 原文地址:https://www.cnblogs.com/wwlwQWQ/p/10492436.html
Copyright © 2020-2023  润新知