概述:
快速幂的应用是在朴素的O(n)算法求数幂不可行时,简化幂的运算的一种方法。
1)递归快速幂思路
递归快速幂的思路主要运用到了二分,即把x的n次方分为x的n/2次方与x的n/2次方的想成,逐步寻根,最后到x的0次方是返回一,递归求解。
这个算法的时间复杂度大概为O(log2n)
代码如下:
int quick(int m,int n,int mod)
{
m = m%mod;
if(n>0)
{
int tmp = quick(m,n/2,mod);
if(n%2==1)
{
return (((tmp*tmp)%mod)*m)%mod;
}else
{
return (tmp*tmp)%mod;
}
}
return 1;
}
2)非递归快速幂思路
非递归的快速幂思路运用到了位运算,即把指数化为一个二进制数,这个二进制数的权值为2的i-1次方,进而把指数化为一个加法式子。
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
则
此算法的时间复杂度为O(log2n)
代码如下:
int quick(int x,int y)
{
int i = 0;
int a = x;
long long ans = 1;
while((y>>i)>0)
{
if((y>>i)&1)
{
ans = (ans*a)%mod;
}
a = (a*a)%mod;
i++;
}
return ans;
}