斐波那契数列的三种求法 - Fibonacci sequence

第一种:

我们最熟悉的递推式:

    F(0) = 0 , F(1) = 1,

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

long long F[10000]={0,1};
long long Fib(int n)  //求斐波那契数列的第n项
{
	if(n==0)return 0;
	else if(n==1)return 1;
	else {
		for(int i=2;i<=n;i++)
		{
			F[i]=F[i-1]+F[i-2];
		}
		return F[n];
	}
}

第二种:

斐波那契数列的通项公式


推导的方法有很多,在这里不详细介绍了,详情请见百度百科斐波那契数列

第三种:

斐波那契数列的矩阵求法

我们将数列的相邻两项Fn和Fn-1组成一个 2 x 1 的矩阵:

由递推公式我们可以得知 Fn = Fn-1 + Fn-2

所以矩阵可表示为    即  

又可表示为两个矩阵相乘的形式:

以此类推 Fn-1 与 Fn-2 所组成的 2 x 1 的矩阵可表示为

所以,因为我们知道 F0=0 、F1=1 ,可得

斐波那契第n项的值就等于二维矩阵的n-1次方再取上面的一行!

这里就可以用到矩阵快速幂,算法并不复杂,重载乘法后跟数的快速幂算法差不多

矩阵快速幂模板:

struct Matrix{
	int a[10][10];
	int x,y;      //矩阵的行数和列数 
	Matrix operator* (Matrix b)
	{
		Matrix ans;
		memset(ans.a,0,sizeof(ans.a));
		ans.x=x;
		ans.y=b.y;
		for(int i=0;i<=ans.x;i++)
			for(int j=0;j<=ans.y;j++)
				for(int k=0;k<=y;k++)
					ans.a[i][j]=(ans.a[i][j]+a[i][k]*b.a[k][j])%mod;
		return ans;
	}
};
 
Matrix Mpow(Matrix a,int b)
{
	Matrix ans;
	memset(ans.a,0,sizeof(ans.a));
	for (int i=1;i<=a.x;i++) ans.a[i][i]=1;
	ans.x=a.x;
	ans.y=a.y;
	while (b)
	{
		if (b&1) ans=ans*a;
		a=a*a;
		b>>=1;
	} 
	return ans;  //ans=a^b;
}

以此类推

you 

you

你可能感兴趣的:(姿势)