在数论中,如果,那么在模意义下互为乘法逆元,记作


计算逆元方法

拓展欧几里得

long long exgcd(long long a, long long b, long long &x, long long &y)// 拓欧
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    long long d = exgcd(b, a % b, y, x);
    y -= (a / b) * x;
    return d;
}
long long inv(long long a, long long p)
{
    long long x, y;
    if (exgcd(a, p, x, y) != 1) // 无解的情形
        return -1;
    return (x % p + p) % p;
}

费马小定理

是质数,且,则有,于是

long long qpow(long long a, long long n, long long p)// 快速幂
{
    long long ans = 1;
    while (n)
    {
        if (n & 1)
            ans = ans % p * a % p;
        a = a % p * a % p;
        n >>= 1;
    }
    return ans;
}
long long inv(long long a, long long p)
{
    return qpow(a, p - 2, p);
}

线性递推

long long Inv[MAXN] = {0, 1};
inline long long mod(long long a, long long p)
{
    return (a % p + p) % p;
}
long long inv(long long a, long long p)
{
    if (Inv[a])
        return Inv[a];
    Inv[a] = mod(-p / a * inv(p % a, p), p);
    return Inv[a];
}
此文章已被阅读次数:正在加载...更新于