LeetCode 372. 超级次方

题目:
给定正整数a,大整数b(数组),求\(a^b\mod1337\)

思路:
稍微思考一下就知道要用快速幂来求,和平时不一样的是,这道题的幂次是以十进制表示的,所以更烤鸭做题者对于快速幂本身的理解。我们以\(a^{345}\)为例,\(a^{345}=a^{3*10^2+4*10^1+5*10^0}=(a^{10^2})^3*(a^{10^1})^4*(a^{10^0})^5\),我们每轮循环需要用base算幂次再更新base(10次方)。

代码:

class Solution {
public:
    int superPow(int a, vector<int>& b) {
        a = a % mod;
        int base = a;
        int ans = 1;
        for (auto i = b.rbegin(); i != b.rend(); i++) {
            int temp = 1, j = 0;
            for (; j < *i; j++) { //计算base^(*i)
                temp = (temp * base) % mod;
            }
            ans = (ans * temp) % mod;
            for (; j < 10; j++) { //原来已经算了*i次了,这里讲temp继续算下去,减少计算次数
                temp = (temp * base) % mod;
            }
            base = temp;
        }
        return ans;
    }

    int mod = 1337;
};
posted @ 2022-04-19 11:42  Unparalleled_Calvin  阅读(20)  评论(0编辑  收藏  举报