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);
}
原文地址:https://www.cnblogs.com/8023spz/p/9948654.html