斐波那契数列——矩阵的幂求解
2015-07-30 19:35
411 查看
题目:
斐波那契数列的递推公式如下:
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)的求解公式
下面的是代码:
斐波那契数列的递推公式如下:
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; }
相关文章推荐
- c++ 解决ifstream在断点debug下无法读取文件问题
- openERP server action,最强大的功能,没有之一
- 暴力求解——打表,暴力
- JavaScript的类型转换(字符转数字,数字转字符)
- 动态生成页面(二)
- Java 8之Lambda
- 数据归一化和两种常用的归一化方法
- 纹理分割(一)Gabor滤波器学习
- 关于博士论文的撰写
- 让你的 EditText 全部清除
- 线程池
- 【leetcode】Linked List Cycle
- 字符编码格式的显示与存储示例分析
- 使用Jsoup库解析HTML、XML或URL链接中的DOM节点
- Cross Validation done wrong
- 销售预收款处理
- 企鹅通讯 1.0 官方版
- Linux cpuidle framework(1)_概述和软件架构
- Java finalize方法使用
- http get请求获取服务器返回的应答数据