1..循环 时间复杂度O(n)
int f(int a) { int f0=0,f1=1,f2=1; if(a) { for(int i=1;i<a;i++) { f2=f0+f1; f0=f1; f1=f2; } return f2; } else return 0; }2. 矩阵求解 时间复杂度O(logn)
斐波那契的递推公式可以表示成如下矩阵形式,所以其

所以根据矩阵的分治算法,可以在O(logn)时间内算出结果。
笔试问题:
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n)。第一个斐波拉契数为F(0) = 1。
给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007。
斐波那契的递推公式可以表示成如下矩阵形式,所以其

所以根据矩阵的分治算法,可以在O(logn)时间内算出结果。
笔试问题:
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n)。第一个斐波拉契数为F(0) = 1。
给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007。
- long[][] f = new long[][]{{0,1},{1,1}};
- public int getNthNumber1(int n) {
- if(n == 0)
- return 1;
- if(n == 1)
- return 1;
- f = pow(n,f);
- turn (int) f[1][1];
- }
- private long[][] pow(int n,long[][] f){
- if(n == 1)
- return f;
- if(n == 2){
- return fun(f,f);
- }
- if( n % 2 == 0){//偶数
- f = pow(n/2,f);
- return fun(f, f);
- }else{
- return fun(pow(n/2,f),pow(n/2 + 1,f));
- }
- }
- private long[][] fun(long[][] f,long[][] m){
- long[][] temp = new long[2][2];
- temp[0][0] = (f[0][0]*m[0][0] + f[0][1]*m[1][0])%1000000007;
- temp[0][1] = (f[0][0]*m[0][1] + f[0][1]*m[1][1])%1000000007;
- temp[1][0] = (f[1][0]*m[0][0] + f[1][1]*m[1][0])%1000000007;
- temp[1][1] = (f[1][0]*m[0][1] + f[1][1]*m[1][1])%1000000007;
- return temp;
- }
3.公式求解 时间复杂度O(1)
利用到数列的公式:an=(1/√5) * [((1+√5)/2)^n-((1-√5)/2)^n](n=1,2,3.....)
取完对数
这是一种模板式的方法,对于一个数a,取t=log10(a),b为log10(a)的小数部分,取10^b得到一个大于1小于10的浮点数,此数就是将原数/10直到只剩个位的数
代码1.:
#include<iostream> #include<cmath> using namespace std; int f(int a) { int f0=0,f1=1,f2=1; if(a) { for(int i=1;i<a;i++) { f2=f0+f1; f0=f1; f1=f2; } return f2; } else return 0; } int main() { int n;double a; while(cin>>n) { if(n<=20)cout<<f(n)<<endl; else { a=-0.5*log10(5.0)+n*log10((1.0+sqrt(5.0))/2.0); a-=(int)a; a=pow(10,a); a*=1000; cout<<(int)a<<endl; } } return 0;
升级例题2.
点击打开链接 (涉及到矩阵求解)(极其重要)
本文探讨了如何使用矩阵快速幂算法在O(logn)时间内解决斐波那契数列问题,同时提供了避免溢出的解决方案,并介绍了利用公式在O(1)复杂度下求解斐波那契数列的方法。
518

被折叠的 条评论
为什么被折叠?



