//
// main.cpp
// dprogram
//
// Created by 吴珝君 on 2019/4/2.
// Copyright © 2019年 闲着也是贤者. All rights reserved.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Fibonacci {
public:
long long res[2][2] = {{1,0},{1,0}};
long long base[2][2] ={{1,1},{1,0}};
int getNthNumber(int n)
{
pow(res, n);
return (int)res[0][0];
}
void pow( long long a[][2], int n)
{
while (n)
{
if(n % 2 ==1 )
mutiply(res, base);
mutiply(base, base);
n /=2;
}
}
void mutiply(long long a[][2], long long b[][2])
{
long long temp[2][2] = {0};
for (int i =0; i <2; i++)
{
for (int j =0; j <2; j++)
{
temp[i][j] = (a[i][0]*b[0][j] + a[i][1]* b[1][j])%1000000007;
}
}
for (int i =0; i < 2; i++)
{
for (int j =0; j <2; j++)
{
a[i][j] = temp[i][j];
}
}
}
};
int main(int argc, const char * argv[])
{
// insert code here...
Fibonacci f;
cout << f.getNthNumber(12);
return 0;
}
本题的主要思想在于把数放到矩阵的不同位置,然后把普通的递推式变成矩阵的等比数列,最后利用快速幂求解递推。
主要有下面两个过程: 构建原始矩阵(初始值)*基础矩阵(等比数列)。