求ab %c的值
(假設ans=ab)
其中a,b,c為整數,且a>0,c<109,b<1018
對於這個問題,我們首先想到的是暴力演算法,for迴圈迴圈b次,最後對c取模,但這樣做會有兩個缺陷
第一:時間複雜度為o(b),如果b很大,那麼計算機需要很長時間計算
第二:即便是long long型資料,a^b也很容易超過long long 的最大值
那麼應該如何優化呢?
首先有這樣有乙個性質:
(ab)%p=[(a%p)(b%p)]%p(可設a=k1p+q1,b=k2p+q2來證明)
通過取模運算的這個性質,我們可以每乘一次a,就對其取模,以此可以解決資料爆掉的問題
但是時間複雜度依然是o(b)
如何繼續優化?
我們考慮手動計算3^10的過程
我們是310=95=9*812
即:當指數b為偶數時,我們直接將指數除以2,然後將底數a平方
當指數b為奇數時,我們
快速冪 高精度求冪
本文講述快速冪的原理,以及用法 定義 快速求,取base為底數的exp次冪,即求 baseexp 時間複雜度 o log n 思想 每一步都把指數分成兩半,而相應的底數做平方運算。不僅能把非常大的指數給不斷變小,所需要執行的迴圈次數也變小,而最後表示的結果卻一直不會變。原理 a b m a m b ...
麥森數 高精度 快速冪
快速冪模板 求a b int ans 1 while b 0 printf d n ans 高精度乘高精度模板 void cheng int a,int b c 0 a 0 b 0 for int i 0 i10 while c k 0 c 0 如下 include include includeu...
位運算以及快速冪
1.原始碼,補碼,反碼 原始碼 原來的那個 反碼 正數的反碼是它本身,負數的反碼為 除了符號位之外,其他位取反。補碼 正數的補碼不變,負數的補碼 反碼 1 2.位運算 邏輯運算 and 只有兩個都為1,結果為1。xor 1xor1 0 0zor0 0 1xor0 1 0xor1 1 or 0or0 ...