高效進行模冪運算

2021-10-05 15:42:09 字數 1771 閱讀 2304

你的任務是計算 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...