0019:快速冪

題目鏈接://www.luogu.com.cn/problem/P1226

給你三個整數 a,b,p,求 a^b mod p 的值

這道題就是快速冪的模板題。

那麼,什麼是快速冪呢?

普通的冪運算就是讓 b 個 a 相乘,但這樣的時間複雜度較高,有 O(n)

接下來就要介紹一種時間複雜度只有O(log n)的演算法。

眾所周知,任何十進位數都可以拆成幾個2^n 相加。如 11=1011=2^3+2^1+2^0。

同理,冪運算可以表示為a^1+a^2+a^3……(不是每個數都有,取決於指數)

進行冪運算時,我們可以將指數轉化2進位,然後判斷它在i維是否為1,如果是,讓結果 *(a^i)。

上程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     long long a,b,p;//一定要用long long,不然只有36分
 5     long long we=1;//一定要賦值為1,如果賦值為0的話所有結果全都是0 
 6     cin>>a>>b>>p;
 7     cout<<a<<"^"<<b<<" mod "<<p<<"=";
 8     while(b){ 
 9         if(b&1){//如果b的最後一位是1 
10             we=(we*a)%p;//結果*a^i 
11         }
12         a=(a*a)%p;//a平方 
13         b>>=1;//捨棄b的最後一位 
14     }
15     cout<<we;
16 }
Tags: