逆元的描述及两种常见求解方式

逆元的描述及两种常见求解方式_第1张图片

求逆元的方法

因为在算法竞赛中模数p总是质数,所以可以利用费马小定理 :
b p − 1 m o d    p = 1 b^{p−1}\mod p=1b
p−1
modp=1
可以直接得到
所以b p − 2 b^{p-2}b
p−2
即为b在 mod p 意义下的逆元

ll pow(ll a, ll n, ll p)    //快速幂 a^n % p
{
    ll ans = 1;
    while(n)
    {
        if(n & 1) ans = ans * a % p;
        a = a * a % p;
        n >>= 1;
    }
    return ans;
}

ll niyuan(ll a, ll p)   //费马小定理求逆元
{
    return pow(a, p - 2, p);
}

还可以利用扩展欧几里德算法

void exgcd(ll a, ll b, ll &x, ll &y)    //拓展欧几里得算法
{
    if(!b) 
        x = 1, y = 0;
    else
    {
        exgcd(b, a % b, y, x);
        y -= x * (a / b);
    }
}

ll niyuan(ll a, ll b)   //求a对b取模的逆元
{
    ll x, y;
    exgcd(a, b, x, y);
    return (x + b) % b;
}

你可能感兴趣的:(算法)