求a的b次幂的快速幂算法
递归写法:
- 如果b=0,返回1
- 如果b是偶数,
- 如果b是奇数,
一般会要结果求对某个数取模,写法如下
typedef long long ll;
ll pow_mod(ll a,ll b,ll mod)
{
if(b==0) return 1;
if(b%2==0)
{
ll res=pow_mod(a,b/2,mod);
return res*res%mod;
}
else return a*pow_mod(a,b-1,mod)%mod;
}
迭代写法:
对于来说,如果把b写成二进制,那么b就可以写成若干二次幂之和。
例如11的二进制是1011,则它的3号位,1号位,0号位就都是1,这样就可以写为
所以
算法过程:
- 将ans初始化为1,用来存放累计的结果
- 判断b的二进制末尾是否为1(即判断b & 1是否为1,也可以理解为判断b是否为奇数)如果是的话,令ans乘上a的值
- 令a平方,并将b右移一位(也可以理解为b除以2)
- 只要b>0就返回2
typedef long long ll;
ll pow_mod(ll a,ll b,ll mod)
{
ll ans=1;
while(b>0)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b=b>>1;
}
return ans;
}