POJ-3070-Fibonacci 解题报告
来源:互联网 发布:山东数据恢复 编辑:程序博客网 时间:2024/05/29 18:03
矩阵快速幂。人生第一次真正意义上写的矩阵快速幂题目啊!题意:Fibonacci数列的第0项为0,第1项为1,第2项也为1,此后第n项等于第n-1项与第n-2项的和。现在给你n,请你输出这个Fibonacci数列第n项的值的后4位数字(即对10000取模的结果)。
我的解题思路:标准矩阵快速幂,首先可以构造一个1×2的初值矩阵[ f(0) f(1) ],然后可以构造这样一个2×2的系数矩阵[ 0 1 1 1 ],这样的话初值矩阵×系数矩阵就得到了这么一个1×2的矩阵[ f(1) f(2) ],因此只要把初值矩阵×系数矩阵的n次方就得到了这样一个1×2的矩阵[ f(n) f(n+1) ]。这个系数矩阵进行幂运算,那就是矩阵快速幂了。
我的解题代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <cctype>#include <cmath>#include <algorithm>using namespace std;const int MATN = 2;const int MOD = 10000;struct matrix //矩阵结构体{ int n, m; //矩阵大小 int mat[MATN][MATN]; matrix(void): n(0), m(0) {} matrix(int _n, int _m): n(_n), m(_m) { memset(mat, 0, sizeof(mat)); } void Unit(int unit) //将矩阵转换为单位矩阵 { n = m = unit; for (int i=0; i<n; ++i) for (int j=0; j<m; ++j) mat[i][j] = i == j ? 1 : 0; }};matrix init, coef; //定义初值矩阵和系数矩阵int n;void InitRead();void DataProcess();matrix MulMod(matrix a, matrix b, int mod); //矩阵乘法matrix MatrixFastPow(matrix base, int n, int mod); //矩阵快速幂int main(){ while (~scanf("%d", &n)) { if (n == -1) break; InitRead(); DataProcess(); } return 0;}void InitRead(){ init.n = 1; init.m = 2; init.mat[0][0] = 0; init.mat[0][1] = 1; coef.n = coef.m = 2; coef.mat[0][0] = 0; coef.mat[0][1] = coef.mat[1][0] = coef.mat[1][1] = 1; return;}void DataProcess(){ matrix ans = MulMod(init, MatrixFastPow(coef, n, MOD), MOD); printf("%d\n", ans.mat[0][0]); return;}matrix MulMod(matrix a, matrix b, int mod){ matrix ans(a.n, b.m); for (int i=0; i<ans.n; ++i) { for (int j=0; j<ans.m; ++j) { ans.mat[i][j] = 0; for (int k=0; k<a.m; ++k) { ans.mat[i][j] += a.mat[i][k] * b.mat[k][j]; } ans.mat[i][j] %= mod; } } return ans;}matrix MatrixFastPow(matrix base, int n, int mod){ matrix ans; ans.Unit(base.n); while (n != 0) { if (n & 1) ans = MulMod(ans, base, mod); n >>= 1; base = MulMod(base, base, mod); } return ans;}
0 0
- POJ-3070-Fibonacci 解题报告
- POJ 3070解题报告
- Fibonacci Again解题报告
- [pa2015]Fibonacci 解题报告
- Fibonacci 解题报告
- ZQUOJ1398 Fibonacci Numbers解题报告
- poj数百篇解题报告
- poj 1141解题报告
- poj 1001解题报告
- poj 1011 解题报告
- poj 1087 解题报告
- poj 2153解题报告
- poj 2051解题报告
- POJ 1167 解题报告
- poj 1026 解题报告
- POJ 1077 解题报告
- POJ 1042 解题报告
- POJ 1095 解题报告
- Java线程:新特征-原子量
- HDU 1007 Quoit Design 最近点对 分治法
- UVA 634 || Polygon(转角法,点在凸包内
- 暗时间 读书笔记
- Windows10消费者浏览版评测(Build 9926)(更新于25号)
- POJ-3070-Fibonacci 解题报告
- Java线程:新特征-障碍器
- Java读取指定文件下的文件名到Excel中
- Codeforces Round #287 (Div. 2) C
- 用数组模拟链表
- Spring+Mybatis 三种查询映射方式
- Linux显示内存状态
- Android利用Fiddler进行网络数据抓包
- 进程地址空间与虚拟存储空间的理解