快速幂

来源:互联网 发布:js涂膜防水 编辑:程序博客网 时间:2024/06/16 10:57

快速幂

关于快速幂,一般有两种实现方式:递归写法和非递归写法。


递归写法:

原理:当n为偶数时,a^n=a^(n/2) * a^(n/2)

  当n为奇数时,a^n=a^(n/2) * a^(n/2) * a

所以可以通过计算a^(n/2)来得出a^n,不断递归下去,O(lb n)

ll power(int a,int b){if(b==0) return 1;ll t=power(a,b>>1);t*=t;if(b&1) t*=a;return t;}

非递归写法:

原理:把指数转化成二进制

e.g.  a^11

11=1011(2)=1*2^3+0*2^2+1*2^1+1*2^0

a^11=a^(1*2^3+0*2^2+1*2^1+1*2^0)=a^(2^3) * 1 * a^(2^1) * a^(2^0)

共有lb a项之积,而这些项可以递推而来,(a^(2^0))^2=a^(2^1),O(lb n)

#include<iostream>using namespace std;#define ll long long int main(){int a,b,ans;cin>>a>>b;ans=1;while(b){if(b&1) ans*=a;a*=a;b>>=1;}cout<<ans<<endl;return 0;}

0 0