LeetCode 372. 超級次方
阿新 • • 發佈:2022-04-19
題目:
給定正整數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; };