快速冪,顧名思義要快速解決數冪問題 樸素演算法中時間複雜度為o(n),在處理大數冪時顯然會爆,這時要使用到快速冪的思想。
對於乙個數的6方a^6們通常使用a*a*a*a*a*a,此時計算機進行5乘法運算,但我們可以將其拆分為(a*a)*(a*a)*(a*a),這樣做的優點在於當我們進行一次a*a運算後,只需將其乘3次即可得到結果,相比於原來的5次節約時間,在冪數更大一些時效果更佳明顯。
那麼問題來了,對於乙個簡單的冪運算我們可以快速找出我們需要的那個基數冪,即上文的a*a,在冪更大時該如何找到我們需要的基數呢。這時在將大數離散化之後,會發生一些變化,例如
a^156 將156呈2進製展開為 10011100
每一位1所代表的數字分別為 4 8 16 128 相加結果為156 那麼我們可以得到
a^4*a^8*a^16*a^128=a^156 這樣我們就找到了需要的基數 a^4
於是可以從二進位制右端計算到左端,
while(n)
將矩陣帶入後便可以解決一些大面積遞推問題。例如大位菲波那切數列問題。
現需要菲數列第1億項模10^6,遞推當然可以解決但是,電腦:我選擇死亡∠( ᐛ 」∠)_。
f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) 當我們用矩陣表示時 會得到
所以當我們需要更多位菲數列時,對中間的(1110)矩陣乘冪 便得到了
後在使用快速冪思想簡化中間矩陣,便解決了矩陣快速冪問題,矩陣快速冪就是把快速冪中的運算方式換成矩陣運算,線性代數中有詳細介紹,直接附上模板
#includeusing namespace std;
const int n=4;
int n;
struct xx
;ori,res;
xx mul(xx x,xx y)
}
快速冪與矩陣快速冪
1 結論 a b mod c a mod c b mod c mod c a b c a c b c 2 先這樣理解一下 int ans 1 a a c if b 2 1 ans ans a c k a a c for i 0 i return ans c 我們把式子轉化成k b 2 modc 所以...
快速冪與矩陣快速冪
快速冪 o logn 時間複雜度 include includeusing namespace std int qpow int base,int n return ans int main 矩陣快速冪 該演算法只適用於方陣 設 a 為方陣 快速求 a n 的演算法 應用 求遞推式的第n項,例如 斐...
快速冪與矩陣快速冪
如果當前的指數是偶數,我們把指數拆成兩半,得到兩個相同的數,然後把這兩個相同的數相乘,可以得到原來的數 如果當前的指數是奇數,我們把指數拆成兩半,得到兩個相同的數,此時還剩餘乙個底數,把這兩個相同的數和剩餘的底數這三個數相乘,可以得到原來的數。求解x 的值 int quickpow int x,in...