poj3070(矩阵快速幂,矩阵乘法)
2016-06-26 12:34
357 查看
求一个巨大的裴波那契数列,
非常不可思议地竟然可以把斐波那契数列优化到O(log n*2^3)的复杂度
同时,用结构体记录矩阵,通过operator对矩阵乘法*,进行重定义
返回结构体,以下是矩阵结构体模版
同时利用快速幂的做法,来对矩阵的乘法来进行复杂度降维!
非常不可思议地竟然可以把斐波那契数列优化到O(log n*2^3)的复杂度
同时,用结构体记录矩阵,通过operator对矩阵乘法*,进行重定义
返回结构体,以下是矩阵结构体模版
同时利用快速幂的做法,来对矩阵的乘法来进行复杂度降维!
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<cstdlib> using namespace std; struct mat { int m[2][2]; int x,y; }ans,d; mat operator * (mat a,mat b) { mat c; memset(c.m,0,sizeof(c.m)); c.x=a.x,c.y=b.y; for (int i=0;i<c.x;i++) for (int j=0;j<c.y;j++) for (int k=0;k<c.x;k++) c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])% 10000; return c; }///operator 的用法!!!!!!结构体的矩阵乘法定义 int n; int matmod(int n) { d.m[0][1]=d.m[1][1]=d.m[1][0]=1; d.m[0][0]=0; ans.m[0][0]=ans.m[1][1]=1; ans.m[0][1]=ans.m[1][0]=0; d.x=d.y=ans.x=ans.y=2; n--; while (n>0)//这里一定要注意!!!!必须大于0时才能进行,当然对于这题来说这里是可以改的!,不过本题的关键还是矩阵快速幂和矩阵乘法以及定义的学习为关键 { if (n&1) ans=ans*d; n>>=1; d=d*d; } if (n!=-1) return ans.m[1][1];else return 0; } int main() { while (scanf("%d",&n)&&n!=-1) printf("%d\n",matmod(n)); return 0; }
相关文章推荐
- 每天一个Linux命令(18)--locate命令
- 输油管道问题-分治
- lintcode_2 Trailing Zeros
- js中 中括号[ ]和.的区别
- 软件工程通用makefile写法学习总结
- Merge Two Sorted Lists
- php调用webservice及myeclipse创建webservice实例
- 如何去掉String的前后空格或某些字符
- Unsupervised Nearest Neighbors Clustering With Application to Hyperspectral Images
- java.net.UnknownHostException: api.weixin.qq.com
- 不同的二叉查找树
- [171] Excel Sheet Column Number
- iOS开发规范
- UVa1601-The Morning after Halloween
- JavaScript判断元素类型
- iOS开发总结之代码规范
- QT QWebKit使用心得(Qwebkit与Html之间通信)
- INFO: Illegal access: this web application instance has been stopped already
- 【CV及DIP资料汇总】博文系列
- QT5 LNK2019 无法解析的外部符号