求斐波那契數列第n項,輸出答案模10^9+7的值(n<2^63)
(對於學過線代的大佬請跳至solution)
我們先介紹一下矩陣,我們表現形式就是二維陣列。而矩陣相對於二維陣列不同的是具有乘法運算。
對於n*m的矩陣a和m*p的矩陣b,表示a*b的矩陣c是n*p的,其中矩陣c的第i行j列的元素滿足
舉個栗子,如下:
順便指一下,對於n*n的矩陣,唯一存在這個矩陣a,使得對於任意矩陣b,a*b=b,其中a的主對角線上所有數為1,其他數為0
對於斐波那契數列f(n)滿足f(n)=f(n-1)+f(n-2)(廢話!)
我們構造矩陣a,使得:
所以,我們可以通過計算a^n來得到答案,誒,這不是也要o(n)時間嗎?別忘了還有快速冪(kasumi),和普通整數的求冪大抵相差不了多少。
#include#include#define mod 1000000007
using namespace std;
typedef long long ll;
struct matrix
matrix operator*(const matrix& mat)
return ans;
}int main()
矩陣加速數列遞推
zoj problem set 3690 code include include using namespace std struct matrix matrix matrix operator const matrix t const undef mod undef maxn int main ...
模板 矩陣加速(數列)(矩陣加速遞推)
a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。矩陣加速裸題 和我的前一篇基本一模一樣 只不過改變了要乘的...
遞推公式的優化 矩陣乘方
想必大家對魔鬼序列 斐波那契數列都不陌生吧 f n 2 f n 1 f n 用程式設計實現的時候,有四種常見的方法 當然乙個比乙個更為優化 1.天真演算法,求哪個就迴圈去求哪個唄,這樣f 0 f 1 前面的這些會重複好多遍計算,當然慢了。2.由底至上的方法,用陣列儲存起來,按照順序乙個個往上計算,這...