首页 > 代码库 > POJ 3070 Fibonacci 矩阵快速求法
POJ 3070 Fibonacci 矩阵快速求法
就是Fibonacci的矩阵算法,不过增加一点就是因为数字很大,所以需要取10000模,计算矩阵的时候取模就可以了。
本题数据不强,不过数值本来就限制整数,故此可以0ms秒了。
下面程序十分清晰了,因为分开了几个小函数了,适合初学者参考下。
#include <stdio.h> const int MOD = 10000; void mulOneMatrix(int F[2][2]) { int a = F[0][0]; int b = F[1][0]; F[0][0] = (a+b)%MOD; F[0][1] = a; F[1][0] = a; F[1][1] = b; } inline void mulMat(int LF[2][2], int RF[2][2]) { int a = LF[0][0] * RF[0][0] + LF[0][1] * RF[1][0]; int b = LF[0][0] * RF[0][1] + LF[0][1] * RF[1][1]; int c = LF[1][0] * RF[0][0] + LF[1][1] * RF[1][0]; int d = LF[1][0] * RF[0][1] + LF[1][1] * RF[1][1]; LF[0][0] = a%MOD; LF[0][1] = b%MOD; LF[1][0] = c%MOD; LF[1][1] = d%MOD; } void powMatrix(int F[2][2], int n) { if (n <= 1) return; powMatrix(F, n>>1); mulMat(F, F); if (n & 1) mulOneMatrix(F); } int calFibonacci(int n) { int F[2][2] = { {1, 1}, {1, 0} };//Fn+1, Fn, Fn, Fn-1 powMatrix(F, n-1); return F[0][0]; } int main() { int n; while (scanf("%d", &n) && -1 != n) { if (n == 0) puts("0"); else printf("%d\n", calFibonacci(n)); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。