斐波拉契加强版

来源:互联网 发布:java调用main函数 编辑:程序博客网 时间:2024/04/30 04:52

题目描述

对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n)。第一个斐波拉契数为F(0) = 1。

给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007。

测试样例:
3
返回:3
运用矩阵快速幂
#include<iostream>#include <vector>#include<string>#include <algorithm>using namespace std;void multi(int a[2][2], int b[2][2]){int res[2][2];res[0][0] = (a[0][0] * b[0][0] + a[0][1] * b[1][0]) % 1000000007;res[0][1] = (a[0][0] * b[0][1] + a[0][1] * b[1][1]) % 1000000007;res[1][0] = (a[1][0] * b[0][0] + a[1][1] * b[1][0]) % 1000000007;res[1][1] = (a[1][0] * b[0][1] + a[1][1] * b[1][1]) % 1000000007;a[0][0] = res[0][0];a[0][1] = res[0][1];a[1][0] = res[1][0];a[1][1] = res[1][1];}int getNthNumber(int n) {int base[2][2];base[0][0] = 1;base[0][1] = 1;base[1][0] = 1;base[1][1] = 0;int ans[2][2];ans[0][0] = 1;ans[0][1] = 0;ans[1][0] = 0;ans[1][1] = 1;while (n){//矩阵快速幂if (n & 1){multi(ans, base);}multi(base, base);n = n >> 1;}return ans[0][0];}int main(){cout << getNthNumber(3) << endl;return 0;}


0 0
原创粉丝点击