所在的位置: C++ >> C++优势 >> 2022C的快速幂

2022C的快速幂

问题引入:

求a^b%c的值

(假设ans=a^b)

其中a,b,c为整数,且0a,c10^9,0b10^18.

算法设计:

对于这个问题,我们首先想到的是暴力算法,for循环循环b次,最后对c取模,但这样做会有两个缺陷

第一:时间复杂度为o(b),如果b很大,那么计算机需要很长时间计算

第二:即便是longlong型数据,a^b也很容易超过longlong的最大值

那么应该如何优化呢?

首先有这样有一个性质:

(a*b)%p=[(a%p)*(b%p)]%p

可设a=k1*p+q1,b=k2*p+q2来证明

通过取模运算的这个性质,我们可以每乘一次a,就对其取模,以此可以解决数据爆掉的问题‘

但是时间复杂度依然是o(b)

如何继续优化?

我们考虑手动计算3^10的过程

我们是3^10=9^5=9*81^2

即:当指数(b)为偶数时,我们直接将指数除以2,然后将底数(a)平方

当指数(b)为奇数时,我们将ans先乘以底数,再将指数b整除2(即舍去小数部分),然后将底数平方

实际上,这样做,我们每次将b整除2,因此如果把b写成2^n的形式,那么只需要n次,即时间复杂度为o(log2(b))

代码如下:

那么加上modc呢?

更进一步,如何输出a^b呢?

依然是利用快速幂的思想,用数组按位运算:




转载请注明:http://www.aierlanlan.com/grrz/3539.html

  • 上一篇文章:
  •   
  • 下一篇文章: