快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N)
算法:例如要求 a^b:
把b转换成二进制数,该二进制数第i位的权为 2^(i-1).
11的二进制是1011
11 = 2º×1 + 2¹×1 + 2²×0 + 2³×1
那么a¹¹ => a^(2º) * a^(2¹)* a^(2³)
写成代码还需要注意一个技巧:a^(2³) = (a^(2²))²
a^(2²) = (a^(2¹))²
a^(2¹) = (a^(2º))²
即可以得到一个递推公式来算 a^(2^(i-1))
令 f(n) = a^(2^n)
则有递推关系 f(n)=f(n-1)^2
//模板:
template<class type>
type Pow(type a,type b){
type result=1;
while(b){
if(b&1) result*=a;
a*=a;
b>>=1;
}
return result;
}
矩阵快速幂