[Leetcode] 372. Super Pow 解题报告

本文介绍了一种高效计算a的b次方模1337的方法,利用数学公式简化计算过程,通过递归方式处理极大数值的情况,并提供C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.

Example1:

a = 2
b = [3]

Result: 8

Example2:

a = 2
b = [1,0]

Result: 1024

思路

不知道出题人为什么会想出来1337这么奇怪的数字?好像1337也不是素数。

这里需要用到两个关键的数学公式:

1) a^b % c = (a % c)^b % c;

2) ab % c = (a % c) * (b % c) % c。

其中1)可以让我们尽可能地缩减a的值,2)可以让我们递归地缩减b的值。当然为了防止溢出,我们需要自己实现一个计算(a^k % c)的函数。

代码

class Solution {
public:
    int superPow(int a, vector<int>& b) {
        if(b.empty()) {
            return 1;
        } 
        a = a % 1337;                                                       // a^b % c = (a % c)^b % c
        int last = b.back();  
        b.pop_back();  
        return (superPow(superPow(a, b), 10) * superPow(a, last)) % 1337;   // a^(10b + c) = a^(10b) * a^c = (a^b)^10 * a^c
    }
private:
    int superPow(int a, int k) {  
        if(k == 0) {
            return 1; 
        }
        int ans = 1;  
        for(int i = 1; i <= k; ++i) {                                       // ab % c = (a % c) * (b % c) % c
            ans = (ans * a) % 1337;
        }
        return ans;  
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值