快速幂思想:
将指数按二进制思想划分为二进制便于计算机处理,时间复杂度为O(logN)
例如,计算3^20
20=10100=2^4+2^2
也就是说3^20=3^(2^4)*3^(2^2),将指数化成了2的幂相加,我们只需要知道3^(2^4)*3^(2^2)即可
直接看代码即可
int Qpow(int a,int n)
{
int ans = 1;
while(n) {
if(n&1) ans *= a;
a *= a;
n >>= 1;
}
return ans;
}
指数化成二进制后,每次将指数最低位与1相与,即可判断最低位是否为1,如果是1说明最终结果包含当前的已经知道的结果
当前底数不断平方,而每次移位后,要记录当前结果并判断是否被包含在最终结果中
然后将指数右移一位,重复计算
当然,如果数太大的话要使用大数进行运算
使用该方法计算斐波那契数列
利用矩阵法
即计算上面的矩阵的n次方,现在使用快速幂
先写一个矩阵乘法
然后使用快速幂算法
注意对角矩阵与任何矩阵相乘为原有矩阵,即对角矩阵相当于'1'