百变斐波那锲以及常用性质(不完善版)

引子:(以下所有代码结果不尽相同,需使得n++,或n--,即可得到符合数列的数)

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:该数列指的是这样的一列数字:1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368…在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。还有一个公式,若求第N(不是很大,否者超过longlong范围)项,可用公式直接算出:

兔子问题

在第一个月有一对刚出生的小兔子,在第二个月小兔子变成大兔子并开始怀孕,第三个月大兔子会生下一对小兔子,并且以后每个月都会生下一对小兔子。 如果每对兔子都经历这样的出生、成熟、生育的过程,并且兔子永远不死,那么兔子的总数是如何变化的?


(图片侵删)

显然,符合上述递推公式。可以用比较基础的方法解决。

#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include <algorithm>
#define ll    unsigned long long
using namespace std;
int main()
{

	ll n,m;
	ll a0=0,a1=1;ll i;
	cin>>n;

	for( i=0;i<n;i+=2)
	{
		a0=a0+a1;
		a1=a0+a1;
	}
	if(i==n) cout<<a1<<endl;
	else cout<<a0<<endl;
}

 

也许许多人觉得,斐波那契数列不过是浩如烟海的数学海洋中的一滴水。但是实际上,从这个数列被提出的那一天起,几百年来人们在许多领域都发现了它的影子。————李永强

生活中上台阶问题

如果我们要上一个N级台阶的楼梯,每次只能走1格或者2格,那么一共有多少种走法呢?

若n很小,可用递归(具体讲解在我的博客分类——基础算法中)


#include<bits/stdc++.h>

#include<iostream>

#include<cstring>

#include <algorithm>

using namespace std;

typedef  long long  ll;ll s;

int jc(ll x);

int main()

{

    ll n,m;

    cin>>n;

    cout<<(jc(n));

}

int jc(ll x)

{

    if(x==0||x==1)   return 1;//边界很重要

    else  return  jc(x-1)+jc(x-2);

}

他自然也符合上述递推公式,但若N比较大,即使用long long也会超过范围,要考虑别的方法。

留白

斐波那锲数列的推广————卢卡斯数列

该数列指的是这样一串数列:1,3,4,7,11,18,............

斐波那锲数列与卢卡斯数列中的一些规律

斐波那锲数列:连续的十个菲波那切数列的和,是这10个数中第7个数的11倍。

卢卡斯数列:前N项的和等于第n+2项减去第2项。(第2项是3)

斐波那契数列的常用性质

以下转自- - - >点我

1、 gcd( F [ n + 1 ] , F [ n ] ) = 1

证明:

根据辗转相减法则

   gcd (F [ n + 1 ] , F [ n ] )
= gcd (F [ n + 1 ] - F [ n ] , F[ n ]) 
= gcd ( F [ n ] , F [ n - 1 ] )
= gcd ( F [ 2 ] , F [ 1 ] )
= 1

2、 F [ n + m ]  = F [ n ] * F [ m + 1 ]  + F [ n - 1 ] * F [ m ] 

证明:

   F [ n + m]  

= F [ n+ m - 1] +F [ n + m - 2 ]

= 2 * F [ n + m - 2 ] + F [ n + m - 3 ]

= 3 * F [ n + m - 3 ] + 2 * F[ n + m - 4 ]

= 5 * F [ n + m - 4 ] + 3 * F[ n + m - 5 ]

= 8 * F [ n + m - 5 ] + 5 * F[ n + m - 6 ]

= ······

= F [ x + 1 ] * F [ n + m  - x ] + F[ x ] * F [ n + m - (x + 1) ]

当 x == m 时 : F [ n + m ]  = F [ m + 1 ] * F [ n ] + F [ m ] * F [ n - 1 ]

3、gcd ( F [ n + m ] , F [ n ] ) = gcd(  F [ n ] , F [ m ] )

证明:

  gcd ( F [ n + m ] , F [ n ]  )
= gcd ( F [ n  + 1 ] F [ m ] +  F [ n ] F [ m - 1 ] , F [ n ] ) //根据2
= gcd ( F [ n +1  ] F [m ] , F [ n ] ) 
= gcd ( F [ n + 1 ] , F [  n ] ) *  Gcd ( F [ m ], F[ n ] )  //根据1
= gcd ( F [  m ] ,  F [ n ] )

4、gcd ( F[ n ] , F[ m ] ) = F[ gcd ( n , m ) ] 

设斐波那契数列第x项为F[x]
则有结论gcd ( F [ n ] , F [ m ] ) = F [ gcd ( n ,m  ) ]

证明:

由3得:

    gcd ( F [  m ] ,  F [ n ] )

=  gcd ( F [ m - n ] , F [ n ] )

=  gcd ( F [m - 2 * n ], F [ n ] )

= gcd ( F [ m % n ] , F [ n ] )

根据代换和递归的思想,其实上边的公式就是辗转相除法gcd(m, n)

所以:gcd ( F[ n ] , F[ m ] ) = F[ gcd ( n , m ) ] 
 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值