数论基础之快速幂(详细教程)

这篇博客详细介绍了快速幂算法,从问题引入、算法原理、应用案例到实战演练,包括递归和循环两种实现方式,并提供了洛谷上的实战题目作为练习,帮助初学者理解和掌握快速幂,提高解决大规模求幂问题的效率。
摘要由CSDN通过智能技术生成

2020.2.17更新,将模板改为c++版,以及增加了对循环版快速幂的理解


一、问题引入

a n   m o d   p a^n \ mod \ p an mod p 的结果

分析

  • 思路:看到这样的题目,我们最容易想到就是直接写一个n次的循环,每次循环乘上一个a,最后再对结果mod p就能得到结果。
  • 改错:为了防止数据溢出,我们利用取模的性质 ( a ∗ b )   m o d   p = ( ( a   m o d   p ) ∗ ( b   m o d   p ) )   m o d   p (a * b) \ mod \ p=((a \ mod \ p)*(b \ mod \ p)) \ mod \ p (ab) mod p=((a mod p)(b mod p)) mod p,循环中每次乘a都mod p一次。
  • 缺陷:这种暴力法的时间复杂度是 O ( b ) O(b) O(b),如果b的值比较大的话,就很难在题目规定的时间内计算出结果。

二、快速幂

其实可以利用分治思想对暴力法进行优化,我们可以这样想:
a n = { a n / 2 ∗ a n / 2 , if  n  is even a n / 2 ∗ a n / 2 ∗ a , if  n  is odd a^n = \begin{cases} a^{n/2}*a^{n/2}, & \text {if $n$ is even} \\ a^{n/2}*a^{n/2}*a, & \text{if $n$ is odd} \end{cases} an={ an/2an/2,an/2an/2a,if n is even

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值