1. 程式人生 > >51nod 1242 斐波那契數列的第N項

51nod 1242 斐波那契數列的第N項

斐波那契數列的定義如下:   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的結果即可。      

輸入

輸入1個數n(1 <= n <= 10^18)。

輸出

輸出F(n) % 1000000009的結果。

輸入樣例

11

輸出樣例

89


矩陣快速冪
程式碼:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define mod 1000000009
using namespace std;

void mul(long long (*a)[2
],long long (*b)[2]) { long long d[2][2] = {0}; for(int i = 0;i < 2;i ++) { for(int j = 0;j < 2;j ++) { for(int k = 0;k < 2;k ++) { d[i][j] += (a[i][k] * b[k][j]) % mod; } d[i][j] %= mod; } } for(int i = 0
;i < 2;i ++) { for(int j = 0;j < 2;j ++) { a[i][j] = d[i][j]; } } } int f(long long n) { long long a[2][2] = {1,1,1,0},d[2][2] = {1,0,0,1}; while(n) { if(n % 2)mul(d,a); n /= 2; mul(a,a); } return d[1][0]; } int main() {
long long n; cin>>n; cout<<f(n); }