斐波那契數列的第N項(1≤n≤10^18 矩陣快速冪)
基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題
斐波那契數列的定義如下:
F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
給出n,求F(n),由於結果很大,輸出F(n) % 1000000009的結果即可。
Input
輸入1個數n(1 <= n <= 10^18)。
Output
輸出F(n) % 1000000009的結果。
Input示例
11
Output示例
89
下圖引自知乎專欄
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#define INF 0xfffffff
using namespace std;
const int N=2;
const long long mod=1000000009;
struct Mat
{
long long v[N][N];
};
Mat matrix_mul(Mat A,Mat B,long long m)
{
Mat ans;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
ans.v[i][j]=0;
for(int k=0; k<N; k++)
ans.v[i][j]+=(A.v[i][k]*B.v[k][j])%m;
ans.v[i][j]=ans.v[i][j]%m;
}
return ans;
}
Mat power(Mat A,long long n,long long m)
{
Mat ans= {1,1,1,0};
while(n)
{
if(n&1)
ans=matrix_mul(ans,A,m);
A=matrix_mul(A,A,m);
n>>=1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
long long n;
cin>>n;
Mat C= {1,1,1,0};
if(n<2) puts("1");
else
{
Mat ans=power(C,n-2,mod);//矩陣快速冪
cout<<ans.v[0][0]<<endl;
}
return 0;
}
相關文章
- 從斐波那契到矩陣快速冪矩陣
- LeetCode 1137第N個斐波那契數LeetCode
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- HDU 4549 M斐波那契數列(矩陣快速冪+費馬小定理)矩陣
- Java斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。Java
- 菲波那契數——根據輸入資料中的n,輸出第n項菲波那契數
- 斐波那契數列數與等冪和
- Java語言非遞迴求第n個斐波那契數Java遞迴
- fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數遞迴
- 斐波那契數列
- LeetCode 1137[第N個泰波那契數]LeetCode
- 斐波那契數列(Java)Java
- 著名的斐波那契數列
- 演算法(1)斐波那契數列演算法
- 第六章 數學問題 -------- 6.14 【快速冪】斐波那契數列
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 斐波那契數列詳解
- 斐波那契數列的通項公式及證明公式
- 太原面經分享:如何用js實現返回斐波那契數列的第n個值的函式JS函式
- 斐波那契數
- js實現斐波那契數列JS
- 斐波那契數列演算法演算法
- 第十題:斐波那契數列
- [C103] 斐波那契數列
- 力扣之斐波那契數列力扣
- 劍指offer——斐波那契數列
- 斐波那契數列js 實現JS
- 斐波那契數列:7數5層魔法塔(1)
- 斐波那契數列的來源——數兔子
- No.8 遞迴快速輸出斐波那契數列遞迴
- 斐波那契數列:7數5層魔法塔(10)
- 大數斐波那契數列的演算法演算法
- 使用Python實現斐波那契數列Python
- 劍指 Offer 10- I. 斐波那契數列
- Leedcode-斐波那契數
- 509. 斐波那契數
- LeetCode 509[斐波那契數]LeetCode
- 一千位斐波那契數