zoukankan      html  css  js  c++  java
  • 力扣372题(超级次方)

    372、超级次方

    基本思想:

    公式1: 两数乘积之模的拆分
    (a * b) % k = (a % k)(b % k) % k

    公式2: 某数的n次幂取模的拆分
    a^n % k = (a % k)^n % k

    递归

    具体实现:

    公式1: 两数乘积之模的拆分
    (a * b) % k = (a % k)(b % k) % k

    公式2: 某数的n次幂取模的拆分
    a^n % k = (a % k)^n % k

    比如假设a=2 b=[1, 2, 3]
    其实就是求a ** 123 % 1337

    根据幂运算的规律,可以把幂运算拆成两数相乘的形式:


    a ** 123 = (a ** 3) * (a**120)
    = (a ** 3) * ((a**12) ** 10)
    利用公式1把上面那个式子拆成两部分:
    part1 = a ** 3 % 1337
    part2 = (a ** 12) ** 10 % 1337

    利用公式2,继续拆分part2
    part2 = (a ** 12 % 1337) ** 10 % 1337

    那最终的结果就变成:
    (part1 * part2) % base

    可以看到,在利用公式2拆分的时候,有一步是:
    (a ** 12 % 1337)

    这其实就是(a ** 123 % 1337)的简化版本,所以这里用递归来解决问题

    代码:

    class Solution:
        def superPow(self, a: int, b: List[int]) -> int:
            base = 1337
    
            if not b:
                return 1
            last = b.pop()
    
            part1 = (a ** last) % base
            part2 = (self.superPow(a, b) ** 10) % base
    
            return (part1 * part2) % base
  • 相关阅读:
    CentOS/RHEL 查看用户登陆信息
    PAM
    块存储
    ECS
    SQL 基础应用
    MySQL 基础管理
    MySQL 体系结构
    JSON对象
    设置dom节点属性的代码优化
    Ext框架下的元素拖动
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/14801733.html
Copyright © 2011-2022 走看看