原文见: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=aa%mod;
}
return res;
}
最后return的ans即为 a^b mod c 的指数幂结果。-------关于转载的理解