逆元 (数论倒数)

(a/b)%c != ((a%c)/(b%c))%c;
正是这个原因,所以引出了逆元的概念

逆元:如果a * b = 1 ( mod p) (就是a乘b模p等于1)
则称b是a关于p的逆元。
例如:2 * 3 % 5 = 1,那么3就是2关于5的逆元,或者说2和3关于5互为逆元。
我们记b的逆元为inv(b),那么( a / b ) % c = ( a * inv(b) ) % c。

费马小定理

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);
}

扩展欧几里德算法

#include
typedef long long LL;
void ex_gcd(LL a, LL b, LL &x, LL &y, LL &d){
    if (!b) {d = a, x = 1, y = 0;}
    else{
        ex_gcd(b, a % b, y, x, d);
        y -= x * (a / b);
    }
}
LL inv(LL t, LL p){//如果不存在,返回-1 
    LL d, x, y;
    ex_gcd(t, p, x, y, d);
    return d == 1 ? (x % p + p) % p : -1;
}

你可能感兴趣的:(ACM)