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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值