嗯,今天是快速冪專題。
相信大家應該都會求冪,即求a^n.那麼這個東西有什麼可講的呢?當然有!樸素的冪計算複雜度是o(n)的,而我們的快速冪則能夠達到o(logn)級別。可能你會覺得線性複雜度已經夠快了,但是在實際應用中,你就會發現快速冪的高效之處。
那什麼是快速冪呢?
快速冪就是在計算a的b次方的時候,把b寫成二進位制和的形式。
比如說計算a^43,我們就可以把43寫成二進位制數101011,每一位乘以對應的權值,就變成了a^(2^0+2^1+2^3+2^5).
那麼這麼做有什麼好處呢?我們的迴圈從原來的43次降為log(43)次,每次不再是n-=1而是n>>=1.這樣就能大大降低複雜度了。
快速冪一般還可以搭配矩陣使用,成為矩陣快速冪。
我們在做矩陣乘法運算的時候,首先有個前提,就是矩陣a的列與矩陣b的行必須相同才能進行乘法運算。最後的結果c的行數等於a的行數,c的列數等於b的列數。c中某個元素等於a對應行向量與b對應列向量乘積之和。這種演算法的時間複雜度為o(n^3).
實際上,在clrs裡,介紹了一種o(n^2.81)複雜度的矩陣乘法,即strassen演算法,它的原理是利用分治,將矩陣分塊,再計算分塊矩陣的乘積,最後合併,在這兒不是重點表過不提,感興趣的可以去看一下。
我們今天要將的是如何求矩陣的冪。我們可以很清楚地看到,如果用樸素矩陣乘法,複雜度會很令人厭惡,所以我們運用快速冪思想,將這個問題轉化成了快速冪問題。矩陣快速冪有很多應用,例如給dp加速之類的,這兒我們講乙個最簡單的應用。
想必大家都知道斐波那契數列(fibonacci sequence)吧!她是數學史上最著名的數列之一,有著許多有趣的性質。那我們怎麼計算第n項斐波那契數列是多少呢?我們至少有四種辦法可以計算。
最樸素的計算方法就是遞迴計算。由於斐波那契數列的遞推式是f(n)=f(n-1)+f(n-2)(n>2),所以我們可以遞迴計算f(n).但是這種方法的時間複雜度高達o(2^n),是無論如何不可能接受的。
我們可以使用非遞迴形式計算遞推式,只要寫乙個一重迴圈就可以了。這種方法是線性複雜度,但仍不夠好。
我們擁有乙個常數複雜度的方法,就是計算它的通項公式。我們用特徵方程與特徵根求出通項公式直接計算,就可以把複雜度壓縮到o(1),但是有個問題,這個整數數列的通項公式裡含有大量的無理數,n一旦變大之後會對精度造成影響。
最後一種自然就是我們的矩陣快速冪。我們可以構造如下的矩陣遞推式:
|fn+1 fn | | 1 1 |^n
= |fn fn-1| | 1 0 |
這時候用到我們的矩陣快速冪就可以了。**如下:
#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int mod=1e4;
struct mat;
mat mul(mat x,mat y)//矩陣乘法
void quickpow(int n)//快速冪
cout<>n)
return 0;
}
數學 快速冪與矩陣快速冪
二進位製取冪的想法是,我們將取冪的任務按照指數的 二進位制表示 來分割成更小的任務 快速冪的遞迴版本 long long fastpower long long a,long long b while迴圈版本 相對於原來的遞迴版本更快 解決你的tle long long fastpower long...
數學 快速冪與矩陣快速冪
1.a sequence of numbers 題目 題解 這是一道隱藏的快速冪的模板題,從資料我們就可以知道。對該題進行分析,如何判別是等差or等比,通過比較a 2 a 1 a 3 a 2 如果相等,則為等差 否則a 2 a 1 a 3 a 2 就為等比,然後利用快速冪來解決等比。includeu...
數學基礎 快速冪
首先,顧名思義,快速冪就是快速的冪 不過可能有人曉得從math裡頭的pow a,b 不過,這樣的快速冪是沒有靈魂的,我們要自己敲 自己手敲冪,最簡單的方法。如下 1 int power int a,intb 2 8return ans 9 這個比較基礎的方法,的時間複雜度當然要比快速冪慢很多了,所以...