题目
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
示例
-
示例一
输入:a = 2, b = [3]
输出:8 -
示例二
输入:a = 2, b = [1,0]
输出:1024 -
示例三
输入:a = 1, b = [4,3,3,8,5,2]
输出:1 -
示例四
输入: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
公式2
- 按照公式1,可将指数运算按照其指数b的每一位拆开累乘,在代码中体现为对b数组倒叙的递归。
- pow(a,b[u]) 表示对指数b的当前位的指数计算,且pow() 方法中已经包含了对 1337 的取余。
- pow() 函数中,首先a对1337取余,然后每次累乘的结果都会取余,其对应公式2中的 (b mod n)。
- pow(dfs(a,b,u-1), 10)对应公式1中的第一个乘数。
注意:
- 由于b过大,必须将指数运算进行拆解。又由于b是数组形式,所以考虑按照每一位进行拆解。因此推导公式1
- 拆解开的指数运算是乘积形式,但最终需要求对1337的余数,所以需要公式2,将其转换为每一项对1337的余
- 由于公式1从K->K\10只有两项,展开到符合b的长度,是一个递归过程,公式2中要把2项乘积扩展也是递归过程,所以本题使用递归方法,从b的个位开始计算。