问题引入:
求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呢?
依然是利用快速幂的思想,用数组按位运算: