快速幂是一个在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或高精度
标签:ab,kn,long,学习,k2,笔记,ans,2n,快速 From: https://www.cnblogs.com/zangqy/p/17568653.html