斐波那契数列——矩阵的幂求解
来源:互联网 发布:知乎36经典回复 编辑:程序博客网 时间:2024/06/06 08:28
题目:
斐波那契数列的递推公式如下:
F(0) = 0;
F(1) = 1;
F(n + 2) = F(n + 1) + F(n);
求数列的第N项的值对10000取余的结果。( 0<=n<= 10^16)
求解斐波那契数列,如果N比较小的情况下,可以直接打表求解,但是对于N很大的情况下,并不适用。
所以,有些人会想到高精度计算,但是,N达到10^5以上时,时间复杂度难以想象,每计算一个数,需要进行高精度加法。然而还有求解对10000的取余的值。
我们可以用矩阵的幂来求解。斐波那契数列的递推公式为F(n + 2) = F(n + 1) + F(n);可以转换为矩阵的形式
将这公式乘开,还是等于上面的递推公式。因此,得到了F(n)的求解公式
下面的是代码:
#include <iostream>#include <vector>using namespace std;typedef vector<int> vec;typedef vector<vec> mat;typedef __int64 ll;const int M = 10000;mat mul(mat &A, mat &B) //矩阵相乘函数{mat C(A.size(), vec(B.size())); //二维数组for(int i = 0; i < A.size(); i++)for(int k = 0; k < B.size(); k++)for(int j = 0; j < B.size(); j++)C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;return C;}mat pows(mat A, ll n) //快速幂运算{mat B(A.size(), vec(A.size())); //二维数组for(int i = 0; i < A.size(); i++)B[i][i] = 1;while(n > 0){if(n & 1)B = mul(B, A);A = mul(A, A);n >>= 1;}return B;}int main(){ll n;while(scanf("%I64d", &n) != EOF) //输入n{mat A(2, vec(2));A[0][0] = 1; A[0][1] = 1;A[1][0] = 1; A[1][1] = 0;A = pows(A, n);printf("%d\n", A[1][0]);}return 0;}
0 0
- 斐波那契数列——矩阵的幂求解
- 【矩阵快速幂】 斐波那契数列求解。
- 1242 斐波那契数列的第N项 运用矩阵快速幂来求解斐波那契数列问题
- 矩阵快速幂求解任意初始值f1,f2及a,b的斐波那契数列
- 矩阵的幂 斐波那契数列
- 波那契数列的复杂度求解
- 矩阵——P1962 斐波那契数列
- 递归求解斐波那契数列
- 递归-求解斐波那契数列
- 斐波那契数列求解
- 02 求解斐波那契数列
- 斐波那契数列求解
- poj3070斐波那契数列求解
- python求解斐波那契数列
- 求解斐波那契数列
- 斐波那契数列求解python3
- 求解斐波那契数列的几种方法
- 基于特征值的斐波那契数列求解
- 常用类之Date类
- 排序汇总
- 第三天上课
- 【leetcode】Linked List Cycle II
- HDOJ 1022 Train Problem I(栈)
- 斐波那契数列——矩阵的幂求解
- HDU 5327 Olympiad
- iOS KVC 概述
- ScrollView介绍
- SVN Cleanup failed to process the following paths
- 线程学习中的错误总结
- 河内塔问题程序
- HDU 5328 Problem Killer
- 关于 android 程序中的 context