在上一期時間複雜度優化的文章中就已經提到過了快速冪,這一期就來講一講快速冪。
什麼是快速冪?
快速冪正如其名,就是快速的冪,「快速」是指這種方法運算速度很快,「冪」就不用說了,(a的b次方的結果,也就是b個a相乘),一提起冪,大家一定會不約而同的想到#include這個標頭檔案和pow函式,但是如果不讓你用這個函式,你會不會就只能寫成這個德行。**如下:
1 #include2如果你只會寫成這樣,那麼你就out了,這樣一來時間複雜度會很高,既然你誠心的進來看快速冪,就表示你現在一定會缺方法來降低時間複雜度,為了優化程式,就得來學一學快速冪了。using
namespace
std;
3int sxpow(int a,intb)4
9int
main()
10
二進位制&快速冪
說起快速冪,就得先提一下二進位制,怎麼也得先會二進位制吧,if(你會二進位制) then 繼續看;else 請圓潤的走開,去學二進位制。不知道為什麼,網上眾多大牛寫的部落格都喜歡用11來舉例,那我也用11來舉例好了。假如要求乙個數a的11次方,那麼就先把11改寫成二進位制1011,也就是11=8+2+1,這樣一來,根據同底數冪相乘,底數不變,指數相加,就把pow(a,11轉化成pow(a,8)*pow(a,2)*pow(a,1),只需要算三次,原來要算十一次,但是pow(a,8)也不好求啊,那就用分治pow(a,8)=pow(a,4)*pow(a,4),那麼pow(a,4)=pow(a,2)*pow(a,2),知道分成pow(a,1)難道pow(a,1)你求不出來嗎?我想你心中一定早就有了答案,**勝於雄辯,先看一看**再繼續解釋:
1這就是快速冪,就像剛才說的一樣,有些地方你可能會看不懂,其中b&1表示b為奇數,這是根據二進位制來判斷的,就比如11,二進位制是1011,1的二進位制是1,1011和1在第一位上相同,其他位1連數字都沒有,所以11&1的值為1,表示11是奇數;除此之外還有b>>=1相當於b/=2,這麼寫是為了快,使用位運算;一般情況下,題中會告你乙個取模值,因為冪算出來有時會很大,說不定會爆記憶體。long
long quickpow(int a,int b,int
mod)211
base*=base;12
base%=mod;
13 b>>=1;14
}15return
ans;
16 }
實戰演練
隨便看兩道題,t1:
這道題看看就好,會了快速冪也不一定能做對,畢竟不是模板題,先說道簡單題再看這道題。
20不知道你練得如何了,(附上測評**a的b次方)現在來回過頭看t1,這道題提到的序列有兩種,分別是等差序列和等比序列,這樣的序列在小學就學過了吧,怎麼判斷是否是等差序列呢,當然好辦,依據等差序列差值相等,只要判斷b-a和c-b是否相等即可,如果這是乙個等差序列,怎麼求第k個數?當然不能一次又一次迴圈叫上差值,小編當初就是這麼寫的,後來發現好像有點麻煩,於是改成了a+(k-1)*sub&200907,看起來很簡單。當然還是等比數列比較麻煩,暴力當然沒轍,**如下:
1 #include2在這拼時間的題裡,怎麼可能用暴力過呢?當然學來的不能丟,要轉化成快速冪,仿照等差數列,那麼等比數列第k個數為a*pow(sub,k-1)%200907,這麼算就會快很多,ac**如下:using
namespace
std;
3long
long a,b,c,k,t,ans;double
sub;
4int
main()
519 cout
21else
2229 cout
31}32return0;
33 }
#include#include//ps:為了不必要的麻煩,換成了scanf和printf,並且把快速冪寫在了main函式裡,以優化程式using
namespace
std;
long
long ans,sub,a,b,c,k,t,base
;int
main()
else
base*=base
;
base%=200907
; k>>=1
; }
printf(
"%d \n
",a*ans%200907
); }
}return0;
}
數論 快速冪
快速冪 演算法介紹演算法利用了二分的思想,可以達到o logn 可以把b按二進位制展開為 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1 這樣 a b a p n 2 n p n 1 2 n 1 p 1 2 p 0 a p n 2 n a p ...
數論 快速冪
沒看懂,先記著 轉 typedef long long ll ll mod ll qpow ll a,ll n 計算a n mod return re mod struct matrix 定義乙個結構體,方便傳遞值 maxn和mod由全域性定義,其中mod根據需要可以省去 matrix mat mu...
校內 快速冪(數論)
輸入乙個自然數 n 求 1 1n n。結果保留6位小數 input 3 output 2.370370 hint n 10100000 當 n 107 時暴力求解即可,當 n 趨於正無窮時為 e的定義,大概在107 左右就穩定了,所以當 n 107 時直接輸出 e 的前6位即可。include in...