1. 程式人生 > 其它 >LeetCode 372. 超級次方

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;
};