• 逆元模板


    一、费马小定理,快速幂(需mod为质数)

    LL pow_mod(LL a, LL b, LL p){//a的b次方求余p 
        LL ret = 1;
        while(b){
            if(b & 1) ret = (ret * a) % p;
            a = (a * a) % p;
            b >>= 1;
        }
        return ret;
    }
    LL Fermat(LL a, LL p){//费马求a关于b的逆元 
            return pow_mod(a, p-2, p);
    }

    二、扩展欧几里得算法

    LL exgccd(LL a,LL b,LL &x,LL &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return a;
        }
        LL g,t;
        g = exgccd(b,a%b,x,y);//递归,先进去,然后再出来,所以X的最终值不是1.。。会在下面三行发生改变
        t = x;
        x = y;
        y = t-a/b*y;
        return g;//顺手求公约数;
    }
    
    LL inv(LL b,LL p)
    {
        LL x,y;
        exgccd(b,p,x,y);
        return x = (x%p+p)%p;
    }

    三、

    非原创

    当p是个质数的时候有
    inv(a) = (p - p / a) * inv(p % a) % p

    证明:
    设x = p % a,y = p / a
    于是有 x + y * a = p
    (x + y * a) % p = 0
    移项得 x % p = (-y) * a % p
    x * inv(a) % p = (-y) % p
    inv(a) = (p - y) * inv(x) % p
    于是 inv(a) = (p - p / a) * inv(p % a) % p

    然后一直递归到1为止,因为1的逆元就是1

    #include<cstdio>
    typedef long long LL;
    LL inv(LL t, LL p) {//求t关于p的逆元,注意:t要小于p,最好传参前先把t%p一下 
        return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;
    }
    int main(){
        LL a, p;
        while(~scanf("%lld%lld", &a, &p)){
            printf("%lld
    ", inv(a%p, p));
        }
    }

    这个方法不限于求单个逆元,比前两个好,它可以在O(n)的复杂度内算出n个数的逆元

    递归就是上面的写法,加一个记忆性递归,就可以了

    #include<cstdio>
    const int N = 200000 + 5;
    const int MOD = (int)1e9 + 7;
    int inv[N];
    int init(){
        inv[1] = 1;
        for(int i = 2; i < N; i ++){
            inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
        }
    }
    int main(){
        init();
    }
  • 相关阅读:
    docker 单kafka ,多分区
    spring data jpa + mysql使用json 类型
    C++ Multithread Tutorial
    GDB 调试程序
    C++ Project 积累(四)
    GDB 调试 C/C++ Project
    makefile 学习(一)
    Ubuntu 下配置 boost + eclipse
    C++ Project 积累(3)
    Leetcode Sudoku Solver
  • 原文地址:https://www.cnblogs.com/albert-biu/p/8609330.html
Copyright © 2020-2023  润新知