[LeetCode]372. 超级次方

[LeetCode]372. 超级次方

题目

你的任务是计算 ab1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。

示例

  1. 示例一
    输入:a = 2, b = [3]
    输出:8

  2. 示例二
    输入:a = 2, b = [1,0]
    输出:1024

  3. 示例三
    输入:a = 1, b = [4,3,3,8,5,2]
    输出:1

  4. 示例四
    输入:a = 2147483647, b = [2,0,0]
    输出:1198

方法

逆序递归

class Solution {
    int MOD = 1337;
    public int superPow(int a, int[] b) {
        return dfs(a, b, b.length - 1);
    }
    int dfs(int a, int[] b, int u) {
        if (u == -1) return 1;
        return pow(dfs(a, b, u - 1), 10) * pow(a, b[u]) % MOD;
    }
    int pow(int a, int b) {
        int ans = 1;
        a %= MOD;
        while (b-- > 0) ans = ans * a % MOD;
        return ans;
    }
}

作者:AC_OIer
链接:https://leetcode-cn.com/problems/super-pow/solution/gong-shui-san-xie-di-gui-kuai-su-mi-ying-yx1j/
来源:力扣(LeetCode

需要公式:
公式1公式1
公式2
公式2

  1. 按照公式1,可将指数运算按照其指数b的每一位拆开累乘,在代码中体现为对b数组倒叙的递归。
  2. pow(a,b[u]) 表示对指数b的当前位的指数计算,且pow() 方法中已经包含了对 1337 的取余。
  3. pow() 函数中,首先a1337取余,然后每次累乘的结果都会取余,其对应公式2中的 (b mod n)
  4. pow(dfs(a,b,u-1), 10)对应公式1中的第一个乘数。

注意:

  1. 由于b过大,必须将指数运算进行拆解。又由于b是数组形式,所以考虑按照每一位进行拆解。因此推导公式1
  2. 拆解开的指数运算是乘积形式,但最终需要求对1337的余数,所以需要公式2,将其转换为每一项对1337的余
  3. 由于公式1K->K\10只有两项,展开到符合b的长度,是一个递归过程,公式2中要把2项乘积扩展也是递归过程,所以本题使用递归方法,从b的个位开始计算。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值