我們在通常處理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 其實快速冪取模也是用到這個定理,那麼根據上面的定理可以推導出另乙...