快速冪 a b p問題

2021-10-22 20:50:42 字數 1145 閱讀 9436

我們在通常處理a^b問題中,一般來說第一時間想到的就是通過迴圈來暴力解決,但是這樣的話時間複雜度就是o(n)。c++**一秒的算力大概是1e7–1e8之間,倘若資料較大,題目就會超時導致tle。因此,我們在這裡介紹一下快速冪的演算法。

題目引入acwing a^b

求 a 的 b 次方對 p 取模的值。

輸入格式

三個整數 a,b,p ,在同一行用空格隔開。

輸出格式

輸出乙個整數,表示a^b mod p的值。

資料範圍

0≤a,b≤1e9

1≤p≤1e9

在這裡,顯然用暴力100%會導致超時,因此我們來看看快速冪。

快速冪演算法的核心思想就是每一步都把指數分成兩半,而相應的底數做平方運算。這樣不僅能把非常大的指數給不斷變小,所需要執行的迴圈次數也變小,而最後表示的結果卻一直不會變。

讓我們先來看乙個簡單的例子:

310=3*3*3*3*3*3*3*3*3*3

310=(3*3)(3*3)(3*3)(3*3)(3*3)

310=(3*3)5

310=(3*3)5

95=(94)*(91)

95=(94)*(91)

95=(65611)*(91)

以下以求a的b次方來介紹

把b轉換成二進位制數。

該二進位制數第i位的權為2的i-1次方

例如a^11

11的二進位制是1011

11=(23)*1 + (22)*0 + (21)*1 + (20)*1

因此,我們將a¹¹轉化為算a(2^0)*a(2^1)*a(2^3)

**實現

#includeusing namespace std;

int qmi(int m, int k, int p)//求m的k次方取余於p

判斷k轉化為2進製後最後一位數是不是1

t = t * t % p;

k >>=1;//2進製數/2,即2進製刪除最後一位數

} return res;

}int main()

輸入樣例

3 2 7
輸出樣例

2

快速冪 a b p和a b p

理解 所謂快速冪,就是解決大數運算的一種思想,更形象的理解為 位運算,而這個位是按二進位制來看的位,比如 8 2 3 1 2 2 0 2 10 2 00 即按二進位制表示為 1000 還可以理解 7634 5 76 5 34 5 5 只是我們將其用了二進位制來減少b,也就是迴圈次數,從而降低複雜度 ...

快速冪問題

所謂的快速冪,實際上是快速冪取模的縮寫 首先,最基本的辦法是 int ans 1 for int i 1 i b i ans ans c ans是對answer的縮寫但是如果a很大,那麼a b的結果就容易非常大,所以在求之前可以先對a做乙個變化 如下 int ans 1 a a c 加上這一句 fo...

快速冪問題

求冪方法 pow函式 也就是平常使用pow函式,最簡單的實現就是一直累乘,可以得到這樣的 123 4567 int pow int a,int n return ans 快速冪取模 根據同餘定理,我們知道 ab m a m b m m 其實快速冪取模也是用到這個定理,那麼根據上面的定理可以推導出另乙...