2021-12-5(LeetCode每日一题)

152 阅读1分钟

超级次方

image.png

题目分析

  • 这道题和快速幂相似,不同之处是指数部分是由数组组成。所以我们对整个运算过程进行分解
ab=a1337a1337=a1330a7a1330a7=a13310a7a13310a7=(a133)10a7...a^b=a^{1337}\\a^{1337}=a^{1330}*a^7\\a^{1330}*a^7=a^{133*10}*a^7\\a^{133*10}*a^7=(a^{133})^{10}*a^7\\...
  • 由此我们看出每次计算只需要计算数组中的一位即可,然后对数组的前nn项进行递归计算

代码

var superPow = function (a, b) {
    const mod = 1337;

    const power = (_a, _b) => {
        let result = 1;
        _a %= mod;
        while (_b !== 0) {
            if (_b & 1 === 1) {
                result = result * _a % mod;
            }
            _a = _a * _a % mod;
            _b >>>= 1;
        }
        return result;
    }

    const dfs = (index) => {
        if (index < 0) return 1;
        return power(dfs(index - 1), 10) * power(a, b[index]) % mod;
    }

    return dfs(b.length - 1);
};