前言: 乘法逆元,一般用于将模意义下的除法转换为乘法
求解普通逆元( a x ≡ 1 ( m o d m ) axequiv 1(mod m) ax≡1(mod m))
拓展欧几里得
首先我们看看逆元的定义:若 a x ≡ 1 ( m o d m ) axequiv 1(mod m) ax≡1(mod m),且a与m互质,则 x x x为 a a a在 m o d m mod m mod m意义下的乘法逆元,记作 a − 1 a^{-1} a−1.
根据这个同余式,我们可以得到 a x + k m = 1 ax+km=1 ax+km=1,且a和m是互质的,那么就满足贝祖等式 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),可以用拓欧求解.
ll exgcd(ll a,ll b,ll &x,ll &y)//ax+by
{
if(b==0)
{
x=1,y=0;
return a;
}
int ret=exgcd(b,a%b,x,y),t=x;
x=y,y=t-(a/b)*x;
return ret;
}
这个板子虽然稍长,但返回值是gcd,用处更广泛
另外,由于gcd求得负数和1最大公约数是-1,exgcd不能用来求解a为负数的情况
快速幂
观察乘法逆元的形式: a x ≡ 1 ( m o d m ) ax equiv1(mod m) ax≡1(mod m).
考虑到欧拉定理: a φ ( m ) ≡ 1 ( m o d m ) a^{varphi (m)} equiv 1(mod m) aφ(m)≡1(mod m).
由于洛谷模版题中给出m为质数,则有:
a
x
≡
a
m
−
1
(
m
o
d
m
)
a
≡
a
m
−
2
(
m
o
d
m
)
ax equiv a^{m-1}(mod m)\a equiv a^{m-2}(mod m)
ax≡am−1(mod m)a≡am−2(mod m)
那
么
,
a
在
m
o
d
m
意
义
下
的
乘
法
逆
元
即
为
a
m
−
2
m
o
d
m
那么,a在mod m意义下的乘法逆元即为a^{m-2} mod m
那么,a在mod m意义下的乘法逆元即为am−2mod m,满足快速幂形式,可使用快速幂求解.
ll fpm(ll x, ll power, ll mod)
{
x%=mod;
ll ans=1;
for (;power;power>>=1,(x*=x)%=mod)
if(power&1)(ans*=x)%=mod;
return ans;
}
ll inv(ll x)
{
return fpm(x,mod-2,mod);
}
代码中的(ans*=x)%=mod
即为(ans=ans*x)=(ans=ans*x)%mod
.