0
点赞
收藏
分享

微信扫一扫

89.a^b (快速幂)

七千22 2022-01-21 阅读 56

由于b是10^9,如果直接遍历一遍b,那就需要10^9次,势必是会超时的

快速幂的思想如下:

一个整数b必然可以表示为多个2的次幂的和

其中c_{k} 一定可以表示为只为0,1两种数字的情况

那么b表示为二进制的话,b 的 k位上的数字就代表 c_{k}

由于c_{k}可以只表示为0,1,对于0的就可以跳过,对于1的才需要记录

快速幂:

  • 让b从尾部开始枚举,a刚开始=a                                                                                                    由于b是表示为关于2的次幂和,所以每次b>>=1,对a^b来说是(a^b)^2,倍增一次
  • 对于b某一位=0,只需要倍增a
  • 对于b某一位=1,需要更新res,res=res*a%p,同时倍增a

#include <iostream>
#include <algorithm>
using namespace std;


int main()
{
    int a,b,p;
    cin>>a>>b>>p;
    int res=1;
    for(;b;b>>=1)
    {
        if(b&1)
            res=1ll*res*a%p;
        a=1ll*a*a%p;
    }
    cout<<res%p;    //可能不一定进入循环,所以需要让res%p
}

 

举报

相关推荐

0 条评论