斐波那契数列——矩阵的幂求解

本文介绍了一种利用矩阵快速幂的方法来高效计算斐波那契数列的大数值问题,尤其适用于数列中非常大的项数情况。通过矩阵相乘和快速幂运算,该方法能够有效地减少计算时间,解决了传统递归方法在大规模数据处理时的时间复杂度过高的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

斐波那契数列的递推公式如下:

F(0) = 0;

F(1) = 1;

F(n + 2) = F(n + 1) + F(n);

求数列的第N项的值对10000取余的结果。( 0<=n<= 10^16)


求解斐波那契数列,如果N比较小的情况下,可以直接打表求解,但是对于N很大的情况下,并不适用。

所以,有些人会想到高精度计算,但是,N达到10^5以上时,时间复杂度难以想象,每计算一个数,需要进行高精度加法。然而还有求解对10000的取余的值。


我们可以用矩阵的幂来求解。斐波那契数列的递推公式为F(n + 2) = F(n + 1) + F(n);可以转换为矩阵的形式


将这公式乘开,还是等于上面的递推公式。因此,得到了F(n)的求解公式



下面的是代码:

#include <iostream>
#include <vector>
using namespace std;

typedef vector<int> vec;
typedef vector<vec> mat;
typedef __int64 ll;

const int M = 10000;

mat mul(mat &A, mat &B)    //矩阵相乘函数
{
	mat C(A.size(), vec(B.size()));  //二维数组
	for(int i = 0; i < A.size(); i++)
		for(int k = 0; k < B.size(); k++)
			for(int j = 0; j < B.size(); j++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
	return C;
}

mat pows(mat A, ll n)        //快速幂运算
{
	mat B(A.size(), vec(A.size()));  //二维数组
	for(int i = 0; i < A.size(); i++)
		B[i][i] = 1;
	while(n > 0)
	{
		if(n & 1)
			B = mul(B, A);
		A = mul(A, A);
		n >>= 1;
	}
	return B;
}

int main()
{
	ll n;
	while(scanf("%I64d", &n) != EOF) //输入n
	{
		mat A(2, vec(2));
		A[0][0] = 1; A[0][1] = 1;
		A[1][0] = 1; A[1][1] = 0;
		A = pows(A, n);
		printf("%d\n", A[1][0]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值