51nod 1242 斐波那契数列的第N项 (矩阵快速幂)
2015-10-28 17:08
423 查看
斐波那契数列的定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。
Input
Output
Input示例
Output示例
F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。
Input
输入1个数n(1 <= n <= 10^18)。
Output
输出F(n) % 1000000009的结果。
Input示例
11
Output示例
89
#include <iostream> #include <algorithm> #include <cmath> #define MOD 1000000009 #define N 2 using namespace std; struct Matrix { long long v ; }; Matrix matrix_mul(Matrix A, Matrix B, long long m) { Matrix ans; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { ans.v[i][j] = 0; for (int k = 0; k < N; k ++) { ans.v[i][j] += (A.v[i][k] * B.v[k][j]) % m; } ans.v[i][j] %= m; } } return ans; } Matrix matrix_pow(Matrix C, long long n, long long m) { Matrix ans = {1, 0, 0, 1}; while (n) { if (n & 1) ans = matrix_mul(ans, C, m); C = matrix_mul(C, C, m); n >>= 1; } return ans; } int main() { long long n; Matrix temp1 = {1, 1, 1, 0}, temp2 = {1, 0, 1, 0}; // temp2{f[2],0,f[1],0}!!!!! temp1[a,b,1,0] ---> f =a*f[n-1]+b*f[n-2] while (cin >> n) { if (n < 2) { cout << 1 << endl; continue; } Matrix res = matrix_pow(temp1, n - 2, MOD); res = matrix_mul(res, temp2, MOD); cout << res.v[0][0] << endl; } return 0; }
相关文章推荐
- BZOJ1965 洗牌
- Invariants, Preconditions and Postconditions不变条件,先验条件和后验条件
- HTTP协议及缓存
- iOS定位原理和使用建议
- 程序员的10条建议
- 随机生成数字填充数组
- 如何诊断节点重启问题
- 使用jsp+javaBean写一个网页计算器
- (26) java泛型实现原理 及 java泛型详解
- 分享一个TCP状态变迁图
- 解决 Eclipse 运行 app 报错: INSTALL_FAILED_NO_MATCHING_ABIS
- 多线程变成整理
- Codeforces Round #116 (Div. 2, ACM-ICPC Rules) C. Letter 暴力
- 设计模式的设计原则
- 网络编程(8)
- 初来乍到
- nginx+php(php-fpm)安装配置
- HTML学习10:表单格式化
- Hive SQL的编译过程
- 第七周项目5 排队看病模拟(改进版)