acm 快速幂

原文见:https://blog.csdn.net/qq_36285879/article/details/53284431
(写的很清楚)

快速幂中的基础理论是:
乘积取模 = 因子全取模再相乘 的 乘积 取模
举例为: (10 * 10)%7=2
等价于 10%7=3 3*3=9 9%7=2
所以2==2 即结论成立。

还存在 (a+b)modc=(amodc+bmodc)modc

自己的一点理解就是 只要涉及到相乘,可以再次取模,这对于最后的结果是不会产生影响的。

因为a^b ,
1 . b若为奇数时,只用将一个a%c取出单独相乘,即可变为b为偶数的情况
2 . b为偶数时,可进行 (a^ 2) ^ (b/2) ---- (a^4) ^ (b/4)----等等不断地进行对 b 的缩小,直到 b/x==0,循环的复杂度会变为以log2 以b为对数快速减少-----代码如下:

long long modexp(long long a, long long b, int mod)
{
long long res=1;
while(b>0)
{
//a=a%mod;(有时候n的值太大了会超出long long的储存,所以要先取余)
if(b&1)//&位运算:判断二进制最后一位是0还是1,&的运算规则为前后都是1的时候才是1;
res=resa%mod;
b=b>>1;//相当于除以2;
a=a
a%mod;
}
return res;
}

最后return的ans即为 a^b mod c 的指数幂结果。-------关于转载的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值