快速幂和快速幂取模
**1. 快速幂
快速幂理解
求a^b的值
普通方法s=a*a循环b次–时间复杂度为O(n)
快速幂求解方法–时间复杂度降到O(log₂N)
1,当b为偶数时,a^b可以转为a^2d 的b/2次方
2,当b为奇数时,a^b 可以转为 a^2的b/2次方,再乘以a
快速幂核心代码
int power(int a,int b)
{
int r=1,s=a;
while(b!=0)
{
if(b%2) r*=s;
s*=s;
b/=2;
}
return r;
}
2. 快速幂取模**
求解a^b%c
解法一:
利用公式a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,
这就解决了a^b可能太大存不下的问题,
但这个算法的时间复杂度依然没有得到优化。
int modexp_simple(int a,int b,int n)
{
int ret = 1;
while (b--)
{
ret = a * ret % n;
}
return ret;
}
解法二:
解法二会利用如下公式进行计算:
其证明过程如下:
因此a^b%m有如下公式:
快速取模核心算法
int PowerMod(int a, int b, int c)
{
int ans = 1;
a = a % c;
while(b>0)
{
if(b % 2 = = 1)
ans = (ans * a) % c;
b = b/2;
a = (a * a) % c;
}
return ans;
}