如果(a *b equiv 1(mod p))
我们就说a和b在mod p的意义下互为乘法逆元,和倒数的概念比较类似
逆元记做(a=inv(b))
逆元有什么用?我们常常会遇到要求结果对一个大质数p取模因为答案很大,出题人为了不麻烦大家写高精
就采取了这样的方法(出现大的质数是不是就在暗示要逆元呢),加减法和乘法对取模运算是封闭的,所以你可以处处取模来避免溢出
但是我们遇到了除法就犯了难,为了解决模意义下的除法运算的问题,我们引入了逆元,inv(a)
其实可以看做模p意义下的({1}over{a})
那么在模p意义下({a} over {b})
就可以变形为(a*inv(b)(mod p))
乘法逆元的方法有扩展欧几里得,费马小定理,线性递推
费马小定理
若p为质数且gcd(a,p)=1,则有(a^{p-1}equiv1(mod p))
则inv[a]=(a^{p-2}(mod p))就是a 的逆元
于是对(a^{p-2})算一下快速幂就好了,注意这个方法只对p是质数的情况有效
inline int quick_pow(long long a,long long b,long long p)
{
long long ans=1;
long long base=a;
while(b)
{
if(b&1)
ans=ans%p*base%p;
base=base*a%p;
b>>=1;
}
return ans;
}
inline long long inv(long long a,long long p)
{
return quick(a,p-2,p);
}
线性递推
公式(inv[i]=(p-p/ i)inv[p\%i]\%p;)
总结
费马小定理真的好用多了,前面的看不看吧