算法:快速幂

思路

假设你要计算 $ a^b$ 你会怎么做?

个别新手可能会想:直接计算 $a$ 个 $b$ 相乘不久可以了吗?

在 $b$ 较小的情况下,这么做确实可以,时间复杂度为 O(b),但如果 $a$ > $10^5$ ,  $b$  > $10^5$, 又要计算 $10^5$ 次 $ a^b$ ……

很明显 ,这么做会 TLE 。

所以我们可以开始分析一下。

以 $2 ^{19}$ 为例。

$2^{19} = 2^{18} \times 2^1 = 4^9 \times 2 = 4^8 \times 2 \times 4^1 = 16^4 \times 2 \times 4 = 256^2 \times 2 \times 4 = 65536 \times 8 = 524288$

因此我们可以得出以下结论:

    当  $b$  为偶数时,$a^b = {(a^2)}^{b\div 2}$;

    当  $b$ 为奇数时,$a^b = a^{b-1} \times a^1= a^{b-1} \times a$  , 多出来的 $a$ 可以单独用一个变量储存。

这就是快速幂的核心思想。

实现代码

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)

练习

P1226

注:快速幂有多种理解方式,这只是其中的一种。

注:快速幂可以通过费马小定理来求逆元方程。

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值