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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值