先來實現乙個矩陣相乘的函式吧。
const int mod=10000;
struct mat
;mat mat_mul(mat x,mat y)//實現兩個矩陣相乘,返回的還是乙個矩陣。
return res;
}
//其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪:
int pow(int n)//還是小範圍資料來說吧,要不然返回值的型別自己定義
return res.a[0][1];
}//時間複雜度log(n)
但是矩陣如何與斐波那契聯絡在一起呢???
對於矩陣乘法與遞推式之間的關係:
如:在斐波那契數列之中
所以
就這兩幅圖完美詮釋了斐波那契數列如何用矩陣來實現。
下面一poj3070/nyoj148為例
給出了矩陣相乘的定義,要你求出斐波那契的第n項對1e4取餘。(實際上就是求其第n項的後四位數)
#includeusing namespace std;
typedef long long ll;
const int mod=10000;
struct mat
;mat mat_mul(mat x,mat y)
void mat_pow(int n)
printf("%i64d\n",res.a[0][1]);
//至於為什麼返回res.a[0][1]請看前面的**
}int main()
return 0;
}
矩陣快速冪 斐波那契數列
time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...
斐波那契數列 矩陣快速冪
輸入格式 輸入乙個正整數n 1 n 1e18 輸出格式 輸出乙個數,數列的第n項 輸入樣例1 1輸出樣例1 1輸入樣例2 3輸出樣例2 2 一 矩陣相乘 若a為n k矩陣,b為k m矩陣,則它們的乘積將是乙個n m矩陣。兩個矩陣能相乘的前提條件為前乙個矩陣的列數等於後乙個矩陣的行數。兩矩陣相乘的 如...
矩陣快速冪求斐波那契數列
求數a aa的n nn次冪,可以採用二分法進行快速計算,即 a n a cdot a n為偶數 a cdot a cdot a n為奇數 end right.an a n a a a cdot a cdot a cdot a cdots a a cdot a cdot a cdot a 2 cdot...