2021.12.5 力扣-每日一题-超级次方

这篇博客介绍了如何通过数学公式和递归方法解决大整数乘法对特定模数取模的问题。作者提供了具体的算法实现,包括一个名为`superPow`的函数,该函数利用了幂运算的性质将大数乘法分解为多个小的模运算。博客内容涉及到动态规划和数学推理,展示了如何高效地处理大整数计算。
摘要由CSDN通过智能技术生成

题目描述:

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

样例:

 方法一:

class Solution {
public:
    int MOD = 1337;
    int superPow(int a, vector<int>& b) {
        return dfs(a, b, b.size() - 1);
    }
    int dfs (int a, vector<int>& b, int rea)
    {
        if (rea == -1)
        {
            return 1;
        }
        return pow(dfs(a, b, rea - 1), 10) * pow(a, b[rea]) % MOD;
    }
    int pow (int a, int x)      //计算a的x次方,注意每次乘积都要模1337
    {
        int ans = 1;
        a %= MOD;
        while (x)
        {
            ans = ans * a % MOD;
            x--;
        }
        return ans;
    }
};

这种数学问题就得考验推导能力了,至于我还是得看三叶姐的题解才行

首先需要知道一个简单的公式:

然后就可以将计算过程分解如下,在每一步乘积后模1337即可:

 最终可以分解为:

\left \{ \left [ \left ( \left ( 99^{0} \right )^{10} \times 99^{2} \right )^{10}\times 99^{3} \right ]^{10}\times 99^{4} \right \}^{10}\times 99^{5}

dfs()函数中乘积的两个值即对应着上述式子中每个括号中的两个值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值