首先,顧名思義,快速冪就是快速的冪php
不過可能有人曉得從math裏頭的pow(a,b),不過,這樣的快速冪是沒有靈魂的,咱們要本身敲代碼。html
本身手敲冪,最簡單的方法。代碼以下ios
1 int power(int a,int b) 2 { 3 int ans=1; 4 for(int i=1;i<=b;i++) 5 { 6 ans*=a; 7 } 8 return ans; 9 }
這個比較基礎的方法,的時間複雜度固然要比快速冪慢不少了,因此,咱們要嘗試下降時間複雜度。測試
開始前,不瞭解二進制和位運算符的請先來這裏——>傳送門spa
代碼以下code
1 int qpow(int a, int b){ 2 int ans=1, base=a; 3 while(b != 0){ 4 if (b%2) 5 ans*=base; 6 base*=base; 7 b>>=1; 8 } 9 return ans; 10 }
代碼較短,很好理解。好比求a的11次方,只須要a1×a2×a8 就行了。htm
接下來,看幾道例題:blog
【題目描述】ci
BSNY 在學等差數列和等比數列,當已知前三項時,就能夠知道是等差數列仍是等比數列。如今給你序列的前三項,這個序列要麼是等差序列,要麼是等比序列,你能求出第 k 項的值嗎。 若是第 k 項的值太大,對 200907 取模。get
【輸入格式】
第一行一個整數 T,表示有 T 組測試數據;
對於每組測試數據,輸入前三項a,b,c,而後輸入 k。
【輸出格式】
對於每組數據輸出第 k 項的值,對 200907 取模。
【樣例輸入】
2 1 2 3 5 1 2 4 5
【樣例輸出】
5 16
一道考驗時間複雜度的題,找到規律就能夠解決了。
代碼以下
1 #include<iostream> 2 #define LL long long 3 using namespace std; 4 LL a, b, c, k, m=200907; 5 LL ans, base; 6 int T; 7 LL qpow(LL a, LL b, LL m){ 8 LL ans=1, base=a; 9 while(b != 0){ 10 if (b%2){ 11 ans*=base; 12 ans%=m; 13 } 14 base*=base; 15 base%=m; 16 b>>=1; 17 } 18 return ans; 19 } 20 void solve(){ 21 cin>>a>>b>>c>>k; 22 if (a-b == b-c){ 23 ans=0; 24 ans+=(b-a)*(k-1)+a; 25 if (ans>m) ans%=m; 26 } 27 else{ 28 base=(b/a)%m; 29 ans=a%m*qpow(base,k-1, m)%m; 30 } 31 cout<<ans<<endl; 32 } 33 int main() 34 { 35 cin>>T; 36 for (int i=1; i<=T; i++) solve(); 37 return 0; 38 }