码迷,mamicode.com
首页 > 其他好文 > 详细

快速幂和逆元问题

时间:2020-03-15 13:27:40      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:暴力   ast   出现   signed   stp   组合数   同余定理   时间   公式   

当计算结果很大时对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);
}

快速幂和逆元问题

标签:暴力   ast   出现   signed   stp   组合数   同余定理   时间   公式   

原文地址:https://www.cnblogs.com/khche/p/12496780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!