快速幂和逆元问题

Posted khche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂和逆元问题相关的知识,希望对你有一定的参考价值。

当计算结果很大时对mod=1e9+7取余,用到同余定理。求2的幂直接暴力求(当然也可以快速幂)
求组合数的时候用到除法,又要取余,所以用到逆元。所以用到逆元公式。

1.什么是逆元

当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:

设c是b的逆元,则有b*c≡1(mod m);

则(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m);

即a/b的模等于 a*b的逆元 的模;

2.费马小定理求逆元

x^(mod-2)为x的逆元,所以 (a/b)%m = [a * (pow(b,mod-2)%mod)]% m;

但是mod=1e9+7,所以暴力求幂会超时,方法是用快速求幂法压缩时间.
//快速幂算法
long long fastpow(int a, unsigned int b)
{
long long int result = 1;
while(b != 0)
{
if(b & 1 == 1)
{
result *= a;
}
a *= a;
b >>= 1;
}
return result;
}

//求逆元算法
long long inv(long long x, int mod)
{
return fastpow(x, mod-2);
}

以上是关于快速幂和逆元问题的主要内容,如果未能解决你的问题,请参考以下文章

逆元以及线性逆元求法(转)

乘法逆元怎么计算

learning 多项式求逆元详解+模板

[数论+模板] 快速幂及快速幂求逆元算法模板(模板)

模板篇NTT和三模数NTT

【总结】逆元的求法