LeetCode解题分享:372. Super Pow

Problem

Your task is to calculate a b a^b ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.

Example 1:

Input: a = 2, b = [3]
Output: 8

Example 2:

Input: a = 2, b = [1,0]
Output: 1024

解题思路

   这一题其实很简单,首先我们可以对底数模1337,这样可以简化问题。这一步很容易理解,接下来,我们来考虑指数,由于给定的指数是一个很长很长的列表,不妨先假设这个列表有只包含两个数字,即 [ b 0 , b 1 ] [b_0, b_1] [b0,b1]。那么,我们的最后的数据就应该是:
a b 0 ∗ 10 + b 1 = ( a b 0 ) 10 × a b 1 a^{b_0 * 10 + b_1} = (a^{b_0})^{10} \times a^{b_1} ab010+b1=(ab0)10×ab1
   那么当我们对指数进行操作时,就是对当前的数据进行求10次方,然后和下一位的指数相乘即可。类似的,当我们的列表包含三个数字时即 [ b 0 , b 1 , b 2 ] [b_0, b_1, b_2] [b0,b1,b2],我们需要这样操作:
a b 0 ∗ 100 + b 1 ∗ 10 + b 2 = ( ( a b 0 ) 10 × a b 1 ) 10 × a b 2 a^{b_0 * 100 + b_1 * 10 + b_2} = ((a^{b_0})^{10} \times a^{b_1}) ^ {10} \times a^{b_2} ab0100+b110+b2=((ab0)10×ab1)10×ab2
   从上面的式子可以看出,我们可以先求出前两位数组成的数字的指数次方,在进行求10次方的操作,再和第三个数的次方相乘即可。以此类推,可以求出后面所有的数字的次方。需要注意的是这里有一个模1337的操作,防止数据过大。

   代码如下:在代码中对求指数操作进行了一定的封装。

class Solution:
    def pow(self, a, b):
        base = a % 1337
        a = 1
        for i in range(b):
            a = base * a
            a = a % 1337
        return a

    def superPow(self, a: int, b) -> int:

        base = a % 1337
        a = self.pow(base, b[0])

        for i in range(1, len(b)):
            a = self.pow(a, 10)
            a = (a * self.pow(base, b[i])) % 1337 
        return a


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值