斐波纳契数列(矩乘快速幂)

[文章目录]

Description

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……现求第n项的斐波纳契数

对于100%的数据,n < 1016

矩阵乘法,构建一个矩阵为

0 1
1 1

由于矩阵具有结合律,所以可以快速幂。每次把n二进制拆分,矩阵自乘

时间O(log n)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MOD 123456789
using namespace std;
long long n;
long long a[3][3],b[3],k1,k2,k3,k4;
int main()
{
        scanf("%lld",&n);
        a[1][1]=0;
        a[1][2]=1;
        a[2][1]=1;
        a[2][2]=1;
        b[1]=1;
        b[2]=1;
        n--;
        while(n)
        {
            if(n&1)
            {
                k1=b[1]*a[1][1]+b[2]*a[2][1];
                k2=b[1]*a[1][2]+b[2]*a[2][2];
                b[1]=k1%MOD;
                b[2]=k2%MOD;
            }
            n/=2;
            k1=a[1][1]*a[1][1]+a[1][2]*a[2][1];
            k2=a[1][1]*a[1][2]+a[1][2]*a[2][2];
            k3=a[2][1]*a[1][1]+a[2][2]*a[2][1];
            k4=a[2][1]*a[1][2]+a[2][2]*a[2][2];
            a[1][1]=k1%MOD;
            a[1][2]=k2%MOD;
            a[2][1]=k3%MOD;
            a[2][2]=k4%MOD;
        }
        printf("%lld\n",b[1]);
    return 0;
}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注