题目:
如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。
给定k和n,请返回k的n次方,为了防止溢出,请返回结果Mod 1000000007的值。
测试用例:
输入:2,3
输出:8
思路:
假设n=3,n可以写成二进制:0x11,。如果是
呢?
。由此可见,n可以写为二进制的形式,即
,其中,
等和n的二进制有关。每当n%2 == 1,说明该位置上有一个“1”,然后再将n右移一位,判断下一位。比如
,那么5的第0位上是1,此时返回值更新为
,右移一位后发现第1位是0,不做操作。接着再次右移一位,发现该位置上为1,返回值更新为
。然后可以发现,我们可以这样想,第一个位置的1,让返回值乘以2,k更新为k*k = 2*2 = 4,第二个位置是0,k更新为k*k = 4*4 = 16,第三个位置的1,让返回值更新为2*16。于是我们可以不断更新k值,而不必去关注幂的具体值。
代码:
class QuickPower:
def getPower(self, k, N):
# write code here
if N == 0 or k == 1:
return 1
MOD = 1000000007
ans = 1
while N > 0:
if (N & 1) == 1:
ans = (ans*k)%MOD
N >>= 1
k = (k*k)%MOD
return ans