如果在数论中,ab = 1(mod) p
,我们就说a 和 b 在模 a = inv(b)
的意义下互为乘法逆元,记作a = inv(b)
求逆元的几个方法
拓展欧几里得
ll exgcd(ll a,ll b, ll &x, ll &y)
{
if( b==0){
x = 1;
y = 0;
return a;
}
ll d = exgcd(b,a % b, y, x);
y -= (a / b) * x;
return d;
}
ll inv(ll a,ll p){
ll x,y;
if(exgcd(a,p,x,y)!=-1){
return -1;
}
return (x % p + p) % p;
}
2.费马小定理。
若p是质数,且gcd(a,p)=1,则有 a p − 1 ( m o d p ) = 1 ( m o d p ) a^{p-1}(\bmod p)=1 (\bmod p) ap−1(modp)=1(modp)
由 a*inv(a) = 1
(
m
o
d
p
)
(\bmod p)
(modp) =
a
p
−
1
(
m
o
d
p
)
a^{p-1}(\bmod p)
ap−1(modp),所以
inv(a) =
a
p
−
2
(
m
o
d
p
)
a^{p-2}(\bmod p)
ap−2(modp)
可以用快速幂实现
#define ll long long
inline ll qpow(ll a,ll n,ll p)
{
ll ans = 1;
while(n>0){
if(n & 1){
ans = ans % p * a % p;
}
a = a % p * a % p;
n >>= 1;
}
return ans;
}
inline ll inv(ll a,ll p)
{
return qpow(a,p-2,p);
}