fibonacci數列就形如:0, 1, 1, 2, 3, 5, 8, 13, ....
現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項
可以看出 第1項為0, 第2項為1, 第三項為1, 第四項為2 = 第三項+第二項, ...... 第n項 = 第(n-1)項+第(n-2)項
即 f(n) = f(n-1) + f(n-2) 設
a為m×p
的矩陣,
b為p×n
的矩陣,那麼稱
m×n的矩陣
c為 矩陣 a和
b的乘積,記作
又矩陣乘法滿足結合律,即
那我們就需要求出 a^(n-1)
例如 4 = 100
4 = 1 * 2 ^(2) + 0 * 2 ^(1) + 0 * 2 ^(0)
a = a ^(1*2^(2)) * a^(0*2^(1)) * a
^(0*2^(0))
**:
public static class matrix
matrix(int row, int col, int op)
}matrix(matrix matrix) }}
matrix multiply(matrix matrix) }}
return ret;
}matrix power(int n)
n = n / 2;
matrix = matrix.multiply(matrix); // 算 a(^n)
}return ret;}}
public static int fibonacci(int n)
if (m == 1)
matrix a = new matrix(2, 2);
matrix b = new matrix(2, 1);
a.value[0][0] = 1; a.value[0][1] = 1;
a.value[1][0] = 1; a.value[1][1] = 0;
b.value[0][0] = 1;
b.value[1][0] = 0;
return a.power(m - 1).multiply(b).value[0][0]; // f(n) = c(n)[0][0] = a^(n-1) b [0][0]
}public static void main(string args)
我們將公式修改一下
f(n) = 6 * f(n-1) + 5 * f(n-2) + n^2 + 6 * n + 5
同樣的, 需要先找出 矩陣 a 和矩陣 b
同樣的 c = ab, 我們需要找的 f(n) = c(n)[0][0]
我們擬構造一下
當 n = 2 和 n = 3 時,
矩陣a 需要做的 就是 n = 3 時 的結果 是 n=2 時的結果 和 矩陣a 相乘
n=3時:
第一行: f(2) = 6 * f(1) + 5 * f(0) + (2+1)^2 + 6 * 2 + 5
第二行: f(1) = n為2時的第一行
第三行: (2+1) ^ 2 = 2^2 + 2*2*1 + 1^2
第四行: 2+1 = 2 + 1
第五行: 1 = 1
體現在矩陣a 中:
我們模擬一下資料:
第乙個數 f(0) : 0
第二個數 f(1) : 1
第三個數 f(2) : 27
第四個數 f(3) : 199
第五個數 f(4) : 1374
......
最後我們修改一下**來實現
我們只需要修改一下矩陣a 和矩陣b就可以了, 帶入剛剛推出來的矩陣a 和矩陣b
public static int fibonacci(int n)
if (m == 1)
int x = ,,,
,};int y = ,,,
,};matrix a = new matrix(5, 5);
matrix b = new matrix(5, 1);
a.value = x;
b.value = y;
return a.power(m - 1).multiply(b).value[0][0];
}
其他的地方不變
測試一下
第6個數 為 f(5) = 6 * f(4) + 5 * f(3) + 5^2 + 6 * 5 + 5 = 9299
缺陷: 當第n個數過大時, 使用int型別裝不下會產生溢位
Fibonacci數列的矩陣運算
fibonacci數列這一族的acm層出不窮,屢屢坑爹,每次好容易看出是它結果又死在o n 演算法上 下面貼出來的是fibonacci數列的o log n 的矩陣演算法 include typedef long long ll typedef struct valuepair valuepair,v...
fibonacci數列矩陣快速冪
對於矩陣 1 1 1 0 的n次冪,第一行第二個元素 右上角 的元素即為fibonacci數列的第n項,由此可以根據矩陣的乘法計算fibonacci數列的元素值 矩陣的快速冪利用的也是冪乘的二分法,只不是換成了矩陣的乘法,可以用函式處理。可以定義乙個二維陣列的結構體 typedef struct m...
優美的Fibonacci數列與矩陣
題目 題意 給定fibonacci數列f,令 分析 對於fibonacci數列的題目來說一般要構造矩陣。那麼本題應該怎樣解決?首先我們設 因為所以得到 那麼,我們繼續有 然後我們可以構造矩陣了。如下 到了這裡,本題完美解決!include include include using namespac...