数学知识 乘法逆元
如果\(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;\)
总结
费马小定理真的好用多了,前面的看不看吧

浙公网安备 33010602011771号