斐波那契数列指的是这样一个数列 0, 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(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-1)+F(n-2) 。显然这是一个线性递推数列。
通项公式:   ,又称为“比内公式”,是用无理数表示有理数的一个范例。
斐波拉契数列也可用矩阵乘法+快速幂求出,其效率远优于以上两种解法O(logn)。
斐波拉契数列在oi中常有出现,是比较重要的数论内容,部分数学结论与斐波拉契数列有关。
 
 
Problem 1 [luogu P1349] 广义斐波那契数列

题目描述

广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列。今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数。

输入输出格式

输入格式:

输入包含一行6个整数。依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内。

输出格式:

输出包含一行一个整数,即an除以m的余数。

此题为斐波拉契数列的一个变形,即递推公式为f[i]=f[i-1]*a+f[i-2]*b;将矩阵变形即可。

 type
rec =record
v :array[..,..] of longint;
end; var
n,m,i,j,p,q,a1,a2 :longint;
jz,ans :rec; function mul(a,b:rec):rec;
var
c :rec;
begin
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+m) mod m;
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+m) mod m;
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+m) mod m;
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+m) mod m;
exit(c);
end; function pow(a:rec; k:longint):rec;
begin
if k= then exit(a);
a:=pow(a,k>>);
if k mod = then exit(mul(a,a)) else exit(mul(mul(a,a),jz));
end; begin
read(p,q,a1,a2,n,m);
jz.v[,]:=;
jz.v[,]:=q;
jz.v[,]:=;
jz.v[,]:=p;
ans:=pow(jz,n-);
writeln(((ans.v[,]*a1+ans.v[,]*a2) mod m));
end.

Problem 2:Fibonacci

【问题描述】

斐波拉契有如下性质:F[1]=1,f[2]=1;F[n]=F[n-1]+F[n-2]是fibonacci的递推吧,求两项的最大公约数。

【输入】

第一行输入一个整数gay;gay<=10

接下来的gay行,每行两个整数gay_a,gay_b;

【输出】

共gay行,每行一个整数,表示F[gay_a]和F[gay_b]最大公约数。(在MOD 19491001意义下)。

input:

5

30 15

14 28

12 24

17 17

30 6

output:

610

377

144

1597

8

我们先来看Fibonacci数列的几个引论

引理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[m+n]=F[m-1]F[n]+F[m]F[n+1]

证明:

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

F[n+m]=a[x]*F[n+m-x]+b[x]*F[n+m-x-1]=a[x]*(F[n+m-x-1]+F[n+m-x-2])+b[x]*(F[n+m-x-1)=(a[x]+b[x])*F[n+m+x-1]+a[x]*F[n+m+x-2];

当x=1时有 a[1]=F[2]; b[1]=F[1];

当x=2时有 a[2]=F[2]+F[1]=F[3];  b[2]=a[1]=F[2];

当x=k+1时有 a[k+1]=a[k]+b[k]=F[k+1]+F[k]=F[k+2] b[k+1]=a[k]=F[k+1];

所以当x=n时 F[n+m]=a[n]F[m]+b[n]F[m-1]=F[n+1]F[m]+F[n]F[m-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])=Gcd(F[n+1]F[m],F[n])=Gcd(F[n+1],F[n])*Gcd(F[m],F[n])=Gcd(F[m],F[n]);

由以上三个引理有:Gcd(F[n],F[m])=F[Gcd(n,m)];

如果不会证明也不知道结论怎么办?打表找规律即可AC。(像我一样)

 const mo=;
type
rec =record
v :array[..,..] of int64;
end; var
m,a,b :rec;
n,i,j :longint;
gc,x,y :int64; procedure csh;
begin
m.v[,]:=;
m.v[,]:=;
m.v[,]:=;
m.v[,]:=;
end; function mul(a,b:rec):rec;
var
c :rec;
begin
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+mo) mod mo;
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+mo) mod mo;
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+mo) mod mo;
c.v[,]:=(a.v[,]*b.v[,]+a.v[,]*b.v[,]+mo) mod mo;
exit(c);
end; function pow(a:rec; k:int64):rec;
begin
if k= then exit(a);
a:=pow(a,k>>);
if k mod = then exit(mul(a,a)) else exit(mul(mul(a,a),m));
end; function gcd(a,b:int64):int64;
begin
if (b=) then exit(a);
exit(gcd(b,a mod b));
end; begin
read(n);
for i:= to n do
begin
csh;
read(x,y);
gc:=gcd(x,y);
a:=pow(m,gc);
writeln(a.v[,]);
end;
end.

Problem 3: 黄金分割比

【问题描述】

把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,用分数表示为(√5-1)/2,取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这个分割点就叫做黄金分割点(golden section ratio通常用φ表示)这是一个十分有趣的数字,我们以0.618来近似表示,通过简单的计算就可以发现:(1-0.618)/0.618=0.6一条线段上有两个黄金分割点。

现在LS要对这个数进行研究,首先他就要想办法用分数逼近黄金数。当然,他需要你给他的是离黄金数的差最小的分数。

【输入】

输入文件只有一行,这一行有一个数N(1≤N≤10^19),表示逼近的分数分母≤N。

【输出】

输出文件只有一行,这一行有一个分数,格式为“x/y”,为你所输出的分数。

【输入输出样例】

Gold.in

10

Gold.out

5/8

给出一个结论即可:而且当n趋向于无穷大时,斐波拉契数列前一项与后一项的比值越来越逼近黄金分割0.618,自己证明。

注意,此题n较大,爆掉int64,需要特判一下。(或者你可以用高精)

 var
f :Array[..] of int64;
i,l :longint;
s :int64;
st :string;
std :string;
begin
f[]:=;
f[]:=;
for i:= to do f[i]:=f[i-]+f[i-];
std:='';
readln(st);
l:=length(st);
if (l<) or ((l=) and (st<=std)) then
begin
val(st,s);
if (s=) or (s=) then writeln('1/1') else
begin
for i:= to do if s<=f[i] then break;
if s=f[i] then writeln(f[i-],'/',f[i]) else writeln(f[i-],'/',f[i-]);
end;
end else
begin
writeln('4660046610375530309/7540113804746346429');
end;
end.

关于斐波拉契数列(Fibonacci)的更多相关文章

  1. Go斐波拉契数列(Fibonacci)(多种写法)

    1 前言 斐波拉契数列有递归写法和尾递归和迭代写法. 2 代码 //recursion func fib(n int) int{ if n < 2{ return n }else{ return ...

  2. 斐波拉契数列(Fibonacci) 的python实现方式

    第一种:利用for循环 利用for循环时,不涉及到函数,但是这种方法对我种小小白来说比较好理解,一涉及到函数就比较抽象了... >>> fibs = [0,1] >>&g ...

  3. python的生成器(斐波拉契数列(Fibonacci))

    代码: 函数版本: #斐波拉契数列(Fibonacci) def fib(max): n=0 a,b=0,1 while n < max: a,b = b,a+b n = n+1 return ...

  4. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  5. 剑指offer三: 斐波拉契数列

    斐波拉契数列是指这样一个数列: F(1)=1; F(2)=1; F(n)=F(n-1)+F(n); public class Solution { public int Fibonacci(int n ...

  6. 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

    递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...

  7. 剑指offer-面试题9.斐波拉契数列

    题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: ...

  8. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  9. 浅谈C#中的斐波拉契数列

    突然对那些有趣的数学类知识感兴趣了,然后就简单研究了一下斐波拉契数列,看看它的有趣之处! 斐波拉契数列(Fibonacci Sequence),又称黄金分割数列,该数列由意大利的数学家列奥纳多·斐波那 ...

随机推荐

  1. JS中的各种类型转换规则(转)

    JS中的类型转换非常恶心,大家都懂的,不过该学还是要学. 今天看犀牛书看到了转换规则,总结出来. X转字符串.数字.布尔值 X表示各种类型的值,直接上图: 值 转数字 转字符串 转布尔值 undefi ...

  2. U9单据UI开发--单据类型UI开发

    1.在解决方案下新建UI界面项目,命名以UI作为后缀 2.先删除系统默认新建的UI界面数据模型,并新建界面数据 3.新建单据类型UIModel(界面数据),以model作为界面数据后缀名 4.修改单据 ...

  3. Unicode 与(UTF-8,UTF-16,UTF-32,UCS-2)

    Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. U+597D = 好 597D 是1 ...

  4. 【转】linux命令详解:md5sum命令

    [转]linux命令详解:md5sum命令 转自:http://blog.itpub.net/29320885/viewspace-1710218/ 前言 在网络传输.设备之间转存.复制大文件等时,可 ...

  5. springMVC,mybatis配置事务

    首先应该对context:include-filter和context:exclude-filter有一个了解,include是包含这个,而不是只包含,下面会有例子看看: 这是我最开始配置的MVC的配 ...

  6. Hibernate延迟加载机制

    延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另 ...

  7. iOS开发 ReactiveCocoa入门教程 第二部分

    ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使用函数响应式(FRP)技术.加上第一部分的讲解,你将会学会如何使用信号量(对事件发出数据流)如何替代标准的动作和事件处理逻辑.你也会 ...

  8. Evolutionary Computing: 4. Review

    Resource:<Introduction to Evolutionary Computing> 1. What is an evolutionary algorithm? There ...

  9. C 风格字符串和strcpy方法的实现

    C语言是面向过程的,所以它并没有所谓封装好的功能强大的string.但是麻雀虽小五脏俱全.在C中,我们一般用 const char* 类型来定义一个字面型字符串. 首先我们了解下C中的基本指针.指针是 ...

  10. 分布式系统开发的一些相关理论基础——CAP、ACID、BASE

    本文主要讲述分布式系统开发的一些相关理论基础. 一.ACID 事务的四个特征: 1.Atomic原子性 事务必须是一个原子的操作序列单元,事务中包含的各项操作在一次执行过程中,要么全部执行成功,要么全 ...