快速幂讲解

快速幂就是快速算底数的n次幂。 其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时  ,a11=a(2^0+2^1+2^3)

11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a2^0*a2^1*a2^3,也就是a1*a2*a8

上代码:

#include<iostream>
using namespace std;
 
int Power(int a, int b){
    int ans = 1;
    while(b > 0){
        if(b&1){
            ans *= a;
        }
        b >>= 1; //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
        a = (a * a); //不断的加倍
    }
    ans %= c;
    return ans;
}
 
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    cout << Power(a, b) << endl;
    return 0;
}

我们首先剖析一下每一行的代码,首先b为11,则二进制为1011

b&1表示如果b为奇数的时候b&1==1,我们计算的时候只需要把11 的二进制不是0的进行乘幂操作,进行一次b>>1,表示除以2

然后进行加倍。

其中要理解a*=a这一步:因为 a*a==a^2,下一步再乘,就是a^2*a^2==a^4,然后同理  a^4*a^4=a^8,由此可以做到a-->a^2-->a^4-->a^8-->a^16-->a^32.......指数正是 2^i ,再看上面的例子,a¹¹= a1*a2*a8,这三项就可以完美解决了,快速幂就是这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值