hihocoder1143 斐波拉契数列
来源:互联网 发布:sql注入绕过空格 编辑:程序博客网 时间:2024/05/22 15:47
题目地址:http://hihocoder.com/problemset/problem/1143
题目比较简单,我用了两种方法做,一种是用矩阵的幂,一种是较实用的循环解法(把中间结果保存)。可是不明白为什么第二种方法时间需要那么多。好吧,直接上代码:
1. 快速矩阵幂
#include<iostream>using namespace std;const int MOD=19999997;struct matrix{ long long int mat[2][2];};matrix ans,base;void init(){ base.mat[0][0]=0; base.mat[0][1]=1; base.mat[1][0]=1; base.mat[1][1]=1; ans.mat[0][0]=1; ans.mat[0][1]=0; ans.mat[1][0]=0; ans.mat[1][1]=1;}matrix multi(matrix a,matrix b){ matrix c; for (int i=0;i<2;++i) for (int j=0;j<2;++j) { c.mat[i][j]=0; for (int k=0;k<2;++k) { c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%MOD; c.mat[i][j]%=MOD; } } return c;}void fabonaci(int n){ while (n) { if (n&1) ans=multi(ans,base); n=(n>>1); base=multi(base,base); } }int main(){ init(); int N; cin>>N; fabonaci(N); cout<<ans.mat[1][1]<<endl; return 0;}
2. 循环,保存中间结果
#include<iostream>using namespace std;const int MOD=19999997;int fabonaci(int n){ int result[2]={0,1}; if (n<=1) return result[n]; int addone=result[0]; int addtwo=result[1]; int ans; for (int i=2;i<=n;++i) { ans=(addone+addtwo)%MOD; addone=addtwo%MOD; addtwo=ans%MOD; } return ans;}int main(){ int N; cin>>N; cout<<fabonaci(N+1)<<endl; return 0;}
0 0
- hihocoder1143 斐波拉契数列
- hihoCoder1143 DP 斐波那契数列矩阵快速幂
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- 斐波拉契数列
- Pell数列--斐波拉契数列的“进化”
- hihocoder1143矩阵快速幂 & hihocoder 1051 & hihocoder 1049 & hihocoder1066
- Android多媒体--音视频播放
- 初识C++之封装
- http状态码详解
- 关于i++的``side effects''
- 第7周项目1:成员函数、友元函数和一般函数有区别(2)
- hihocoder1143 斐波拉契数列
- 学习Android从0开始之ActionBar(活动条)
- [OJ]24点游戏之递归实现(JAVA)
- JavaScript形参和实参
- Jsonp学习记录
- 第七周项目一-三个函数在一个程序中(5)
- 搜索0之1001
- HDU 1024 Max Sum Plus Plus(求m个不相交连续子序列最大和/01背包)
- 你看不见的幕后推手