快速幂·学习笔记

发布时间 2023-07-20 20:16:39作者: 臧清宇
快速幂是一个在O(log2n)的时间内计算ab的技巧,相比直接暴力计算O(n)的时间复杂度快了许多。

原理

在计算ab的时候,将b转换为kn*2n+kn-1*2n-1+……+k2*22+k1*21+k0*20(kn,kn-1,……k2,k1,k0取0或1),运用a(m+n)=am·an

所以ab=a(kn*2n+kn-1*2n-1+……+k2*22+k1*21+k0*20=kna2^n+kn-1a2^n-1+……+k2a2^2+k1a2^1+k0a2^0

例:a13=a(1101)2=a8·a4·a1•

代码

#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main(){
    cin>>a>>b;
    long long n=a,ans=1;
    while(b!=0){
        if(b&1==1){//判断b转二进制末尾是否为1
            ans=ans*n;
        }
        n=n*n//n每次平方 由一次方变为平方,再变为四次方,八次方
        b=b>>1;
    }
    cout<<ans;
    return 0;
}

 注意事项

ans,n均以指数增长,有时取模,有时要用long long或高精度