思路
假设你要计算 你会怎么做?
个别新手可能会想:直接计算 个
相乘不久可以了吗?
在 较小的情况下,这么做确实可以,时间复杂度为 O(b),但如果
>
,
>
, 又要计算
次
……
很明显 ,这么做会 TLE 。
所以我们可以开始分析一下。
以 为例。
因此我们可以得出以下结论:
当 为偶数时,
;
当 为奇数时,
, 多出来的
可以单独用一个变量储存。
这就是快速幂的核心思想。
实现代码
long long mi(long long di,long long zhi){
long long ans=1;
for (;zhi>0;){
if (zhi%2==0){
zhi>>=1;
di*=di;
}
else{
ans*=di;
zhi--;
}
}
return ans;
}
时间复杂度
O( log n)
空间复杂度
O(1)
练习
注:快速幂有多种理解方式,这只是其中的一种。
注:快速幂可以通过费马小定理来求逆元方程。