快速幂

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

  首先介绍两个位运算。设有整数x。&:x&1就是取x的二进制的最低位,判断和1是否相同,相同返回1,不同返回0,可用于判断奇偶,如果x&1返回1,表示x是奇数,否则为偶数。>>:x>>1,把x的二进制右移一位,即去掉最低位,这个操作等同于把x的十进制除以2,例如10进制的一个数20,去掉最低位0以后就相当于除以了10,二进制是同理。与之相似的还有左移操作<<。

快速幂的原理:如果我们要求a的b次方的值,则把b写成2进制数,假设一种情况b等于11,11的二进制是1011,所以11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此将a的11次方转化为11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1。
朴素算法和快速幂算法:
typedef long long ll;
ll fun1(ll a,ll b)
{
    ll ans=1;
    for(int i=0;i<b;i++)
        ans=ans*a;
    return ans;
}////朴素算法
typedef long long ll;
ll fun2(ll a,ll b)
{
    ll base=a;
    ll ans=1;
    while(b!=0)
    {
        if(b&1)
            ans=ans*base;
        base=base*base;
        b=b>>1;
    }
    return ans;

}///////快速幂算法

         读者可以用两种算法手算模拟一遍a的11次方的过程。

        此外,在ACM竞赛中通常我们需要的是a的b次方取模mod的结果,不然a和b太大会爆long long,此时只需要将上述算法中的两处修改一下即可,将语句”ans=ans*base;“修改成"ans=(ans*base)%mod;",将语句 ”base=base*base“修改成” base=(base*base)%mod;“。

      

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页