你的任務是計算 a^b 對 1337 取模
,a 是乙個正整數,b 是乙個非常大的正整數且會以陣列形式給出
。
示例 1:
輸入: a =
2, b =[3
]輸出:
8
示例 2:
輸入: a =
2, b =[1
,0]輸出:
1024
單就這道題可以有三個難點:
那麼對於這幾個問題,我們分開思考,逐個擊破。
如何處理陣列指數:
看到這,我們的老讀者肯定已經敏感地意識到了,這就是遞迴的標誌呀!因為問題的規模縮小了:
superpow
(a,[1,
5,6,
4])=
>
superpow
(a,[1,
5,6]
)
那麼,發現了這個規律,我們可以先簡單翻譯出**框架:
// 計算 a 的 k 次方的結果
// 後文我們會手動實現
intmypow
(int a,
int k)
;int
superpow
(int a, vector<
int>
& b)
到這裡,應該都不難理解吧!我們已經解決了 b 是乙個陣列的問題,現在來看看如何處理 mod,避免結果太大而導致的整型溢位。如何處理 mod 運算:
證明很簡單,假設:
a = ak +b;b = ck + d
其中 a,b,c,d 是任意常數,那麼:
ab = ack^
2+ adk + bck +bd
ab % k = bd % k
又因為:
a % k = b;b % k = d
所以:(a % k)
(b % k)
% k = bd % k
綜上,就可以得到我們化簡求模的等式了。
int base =
1337
;// 計算 a 的 k 次方然後與 base 求模的結果
intmypow
(int a,
int k)
return res;
}int
superpow
(int a, vector<
int>
& b)
如何高效求冪:
快速求冪的演算法不止乙個,就說乙個我們應該掌握的基本思路吧。利用冪運算的性質,我們可以寫出這樣乙個遞迴式:
快速冪模運算
經常碰到要求 a b c的題目,這個時候a,b,c一般都在int範圍內,但是a b可能就超出int表示的範圍了。這個時候要快速求解 a b c可以採用快速冪模運算,基本原理如下 a b modc amodc bmodc modc a b modc amodc b modc a b modc a bm...
快速冪運算和快速冪取模運算
如果我們要求乙個數x的n次冪,樸素的想法是讓n個x相乘。對與n很大的情況,會造成一定的時間浪費。這裡講解一下o nlogn 的快速冪解法 我們考察a 11 次方。我們將它的冪用二進位制形式表示 11轉化為二進位制是1011 也就是a 1011。我們將它再做一步轉換。二進位制 數字轉化成對應1相加的形...
快速冪取模運算
1.如果b是偶數,我們可以記k a2 mod c,那麼求 k b 2 mod c 就可以了。2.如果b是奇數,我們也可以記k a2 mod c,那麼求 k b 2 mod c a mod c k b 2 mod c a mod c就可以了。那麼我們可以得到以下演算法 演算法4 int ans 1 a...