矩阵乘法 求斐波那契数列

先简单介绍一下矩阵乘法求斐波那契数列的原理
f(n) 是第n项的值。
f(1)= 1; f(2) =1;
f(n)= f(n-1) + (n-2)
下面的介绍是我从网上查到了,收益匪浅。
分两步推导:
矩阵乘法 <wbr> <wbr>求斐波那契数列

矩阵乘法 <wbr> <wbr>求斐波那契数列

   问题的求解就变成 矩阵乘法 <wbr> <wbr>求斐波那契数列的解决,而幂的求可用二分法来求 
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;
struct matrix
{
	int a[2][2];
};
matrix mul(matrix &x, matrix &y)
{
	matrix res;
	int sum;
	for(int i=0; i<2; i++)
	for(int j=0; j<2; j++)
	{
		sum = 0;
		for(int k=0; k<2; k++)
		sum += x.a[i][k]*y.a[k][j];
		res.a[i][j] = sum;
	}
	x = res;
	return x;
}
matrix pow(matrix x, long e)
{
	matrix ans, temp;
	if(e == 0)
	{
		ans.a[0][0]=1;
		ans.a[0][1]=0;
		ans.a[1][0]=0;
		ans.a[1][1]=1;
		return ans;
	}
	if(e == 1)
	return x;
	temp = pow(x, e>>1);
	ans = mul(temp, temp);
	if(e&1)
	ans = mul(ans,x);
	return ans;
	
}
int main()
{
	int n;
	matrix ans;
	matrix base ={{1,1,1,0}};
	while(~scanf("%d", &n))
	{
		if(!n) printf("0\n");
		else
		{
			ans = pow(base, n-1);
			printf("%d\n",ans.a[0][0]);
		}
	}
system("pause");
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值