先贴代码:
long long fast_power(long long a,long long b,long long c)
{
long long ans=1;
while(b)//当b!=0时
{
//如果b是奇数,此处时位运算优化,如果b转为二进制后末尾是1那么b一定是奇数
if(b&1) ans=(ans*a)%c;
//当b是偶数的时候,执行的是下面两句,b是奇数时也会执行下面两句,所以放在if的外面,不必再开一个else
a=(a*a)%c;
b>>=1;//位运算,相当于b/=2
}
return ans;
}
此代码有两处优化:1、b&1 等同于b%2==1 (即判断b是不是奇数)
2、b>>=1 位运算,相当于b/=2;
快速幂大体思想,当幂方是偶数时,将底数化为平方,幂方除2,并且每次的乘法运算都对c取模来降低复杂度,优化后的复杂度为(log2b);
举个例子:3^10=((3^2))^5=9^5=9*(9*9)^4=9*(81)^2; (建议手写在纸上按上述所说的模拟一遍)