斐波那契序列 集锦

[定理1] 标准Fibonacci序列(即第0项为0,第1项为1的序列)当N大于1时,一定有f(N)和f(N-1)互质

其实,结合“互质”的定义,和一个很经典的算法就可以轻松证明
对,就是辗转相除法
互质的定义就是最大公约数为1

数学归纳法是很有用的证明方法,我们接下来这个定理用数学归纳法就很好证明:
[定理2]若i为奇数, f(i)*f(i)=f(i-1)*f(i+1)+1,否则f(i)*f(i)=f(i-1)*f(i+1)-1
对,这个定理用数学归纳法可以轻松证明,大家有兴趣可以自己尝试

[定理3] f(n)=f(i)*f(n-i-1)+f(i+1)*f(n-i)

f(n)=f(1)*f(n-2)+ f(2)*f(n-1)
    =f(2)*f(n-3)+ f(3)*f(n-2)
    =f(3)*f(n-4)+ f(4)*f(n-3)
看来没有错,证明方法就是这样

这个公式也可以用来计算较大的fibonacci数除以某个数的余数

设i=n/2 不过,为了保证计算能延续下去 需要每次保留三个值
这样,下一次计算就可以利用这三个值来求出两个值,再相加就可以得到第三个值
譬如,计算出f(5),f(6),f(7),可以计算出f(11)、f(12),然后推出f(13)
就是刚才洛奇的悲鸣(364738334)所提到的矩阵方法
我们知道我们若要简单计算f(n),有一种方法就是先保存
a=f(0),b=f(1),然后每次设:
a'=b b'=a+b

并用新的a'和b'来继续这一运算

如果大家熟悉利用“矩阵”这一工具的话,就知道,如果把a、b写成一个向量[a,b],完成上述操作相当于乘以矩阵
0 1
1 1
也就是说,如果我们要求第100个fibonacci数,只需要将矩阵
[0,1]乘上
0 1
1 1
的一百次方,再取出第一项

因为我们知道,矩阵运算满足结合律,一次次右乘那个矩阵完全可以用乘上那个矩阵的N次方代替,更进一步,那个矩阵的N次方就是这样的形式:
f(n-1) f(n)
f(n) f(n+1)

而求矩阵的N次方,由于矩阵乘法满足结合律,所以我们可以用log(N)的算法求出——这个算法大家都会么?
一个是二分,一个是基于二进制的求幂

二分的原理:要求矩阵的N次方A(N),设i=N/2若N%2==1, 则 A(N)=A(i)*A(i)*A(1)若N%2==0, 则 A(N)=A(i)*A(i)

基于二进制的原理:将N拆为二进制数,譬如13=1101那么 A^13= A^8 * A^4 * A^1 (这里^表示幂运算)

也就是说,由A^1开始,自乘得到A^2,然后自乘得到A^4,如果N对应位为1,则将这个结果乘到目标上去

这样的话,将所有乘法改为模乘,就可以得到一个较大Fibonacci数除以M的余数

若不用递归,其实类似

http://acm.pku.edu.cn/JudgeOnline/problem?id=3070
这里用的fib矩阵略有不同,是
f(n+1) f(n)
f(n) f(n-1)
但实际上可以验证效果是一样的

这题是要求求F(n)的最后四位数,所有乘法过程增加一个模10000的步骤即可,大家可以收藏稍候AC

关于矩阵我们告一段落,等下会回来继续探讨利用矩阵来解决复杂些的Fibonacci问题

http://acm.hdu.edu.cn/showproblem.php?pid=1568
我们来看这题,这题要求求出Fibonacci某项的前四位

当然,用矩阵也可以解决这道题——只要将乘法改为乘并保留前四位

我们采用double 保留整数部分四位 这题最好还是double吧

不过显然有更好的解法——如果我们知道Fibonacci序列的通项公式

F(n) = (((1+Sqrt(5))/2)^n - ((1-Sqrt(5))/2)^n)*1/Sqrt(5)

不过组合数学里也有这一公式的推导方法 叫做“线性齐次递推式”

这个解法的核心是,通解是某个数的幂 将f(n)=x^n代入递推方程,可以解出三个通解 0和 (1+sqrt(5))/2

通常把“0”称作平凡解,那么特解就是通解的某个线性组合

再代入f(0)=0 f(1)=1,就可以得出我们刚才的公式

不过通常情况下,我们只需要记住那个公式就可以了

提醒大家,记忆公式的时候千万别忘记了系数1/sqrt(5)

因为(1-sqrt(5))/2的绝对值小于1

所以当i较大的时候,往往可以忽略掉这一项
f(i)≈((1+Sqrt(5))/2)^n/sqrt(5);

所以,刚才列举出的HDOJ的1568,可以很简单的30以内直接求解,30以上采用这个公式,还是用log(N)求幂的算法求解
恩,就是公式的前半部分

http://acm.hdu.edu.cn/showproblem.php?pid=1021
http://acm.zju.edu.cn/show_problem.php?pid=2060
Fibonacci某项是否被3整除

[定理5] 标准Fibonacci序列对任意大于2的正整数的余数序列,必然是以“0 1”为循环节开头的序列

显然0、1是序列开头,也就是说序列开头就是循环节开头

循环长度的计算貌似是个比较难的问题,我一时还没有想到有效解法,不过,要说明的是,计算复杂度时,这个循环节长度应该按复杂度O(N^2)计算

恩,证明方法是利用同余定理、反证法,还有我们之前证明过的相邻项一定互质的定理,留给大家家庭作业

http://acm.hdu.edu.cn/showproblem.php?pid=1588
这是前天比赛关于Fibonacci的一道题,大家先看看题。
Description看后半部分就行了

现在告诉大家一种正确解法,然后大家就可以去搞定这道题向别人炫耀了

首先,我们将问题整理一下,就是对等差数列 ai=k*i+b,求所有的f(ai)之和除以M的余数

当0<=i<N

大家有没有想到,因为ai是等差数列,倘若f(ai)也是个等什么序列,那说不定就有公式求了

f(ai)显然不是等差数列,直接看上去也不是等比数列

但是如果把f(ai)换成我们刚才所说的Fibonacci矩阵呢?

是的,可是我们对矩阵是直接求幂即可,由于矩阵加法的性质,我们要求A^ai的右上角元素之和,只要求A^ai之和的右上角元素

就矩阵这个东西来说,完全可以看作一个等比数列,
首项是:A^b
公比是:A^k
项数是:N

呵呵,我们可以把问题进一步简化

因为矩阵的加法对乘法也符合分配律,我们提出一个A^b来,形成这样的式子:
A^b*( I + A^k + (A^k)^2 + .... + (A^k)^(N-1) )

A^b 和 A^k 显然都可以用我们之前说过的方法计算出来,这剩下一部分累加怎么解决呢

简单起见,设A^k=B
要求 G(N)=I + ... + B^(N-1),设i=N/2
若N为偶数,G(N)=G(i)+G(i)*B^i
若N为奇数,G(N)=I+ G(i)*B + G(i) * (B^(i+1))

呵呵,这个方法就是比赛当时ACRush用的
而农夫用的则是更精妙的方法,大家可想知道

我们来设置这样一个矩阵
B I
O I
其中O是零矩阵,I是单位矩阵

将它乘方,得到
B^2 I+B
O   I
乘三方,得到
B^3 I+B+B^2
O   I
乘四方,得到
B^4 I+B+B^2+B^3
O   I

既然已经转换成矩阵的幂了,继续用我们的二分或者二进制法,直接求出幂就可以了

http://online-judge.uva.es/p/v110/11089.html
大家来读读这一题

Fibinary数是指没有相邻的两个1的二进制数。给N,求出第N大的Fibinary数

相对于二进制中每一位的值是2的幂,十进制中每一位的值是十的幂,
Fibonacci进制是每一位的值是对应Fibonacci数的一种计数系统。
     8 5 3 2 1
1     1
2     1 0
3     1 0 0
4     1 0 1
5     1 0 0 0
6     1 0 0 1
7     1 0 1 0
8     1 0 0 0 0
9     1 0 0 0 1
10   1 0 0 1 0
11   1 0 1 0 0
12   1 0 1 0 1
以上是前12个数字对应的十进制到Fibonacci进制的表格

Fibonacci的运算方法很奇怪。首先,它每一位上非0即1,而且不同于二进制的逢二进一或者十进制的逢十进一,它的进位方法是逢连续两个1,则进1

譬如
1010110==> 1011000 ==> 1100000==>10000000

在最低位有个特殊情况,最低位既可以逢2进1,也可以和次低位一起逢相邻进1
这种奇怪的进位方法,换句话描述就是,不存在两个连续的1
因为Fibonacci数其实也增长很快,int范围内好像只有46个,本题只需要用最简单的办法转换成Fibonacii进制即可
其中一题是
http://www.mydrs.org/program/down/ahoi2004day1.pdf
中的第二题,叫做数字迷阵
还有一题是PKU上的很出名的取石子问题
http://acm.pku.edu.cn/JudgeOnline/problem?id=1067

这题相当复杂,大家可以自己思考,往Fibonacci上想,也可以阅读这里的论文:
http://episte.math.ntu.edu.tw/articles/mm/mm_03_2_02/index.html
http://acm.pku.edu.cn/JudgeOnline/problem?id=2967

另外这题 可以利用Fibonacci判断数据范围进行优化设计。不过貌似可以水过去,仅仅给大家提供个思路罢

关于Fibonacci和黄金分割,还有很多更高明的结论和定理,希望大家也继续讨论,将自己的知识和他人共享
http://episte.math.ntu.edu.tw/articles/mm/mm_02_4_10/index.html
中例3详细讲述了用生成函数来计算Fibonacci数公式的运算过程。http://acm.hdu.edu.cn/showproblem.php?pid=1568
Fibonacci 求fibonacci前4位

http://acm.hdu.edu.cn/showproblem.php?pid=1588
Gauss Fibonacci
http://acm.pku.edu.cn/JudgeOnline/problem?id=1067
取石子问题
http://episte.math.ntu.edu.tw/articles/mm/mm_03_2_02/index.html 是报告
http://acm.pku.edu.cn/JudgeOnline/problem?id=3070
Fibonacci矩阵
http://acm.hdu.edu.cn/showproblem.php?pid=1021

http://acm.zju.edu.cn/show_problem.php?pid=2060
Fibonacci某项是否被3整除
http://acm.pku.edu.cn/JudgeOnline/problem?id=2116
Fibonacci进制计算
http://acm.pku.edu.cn/JudgeOnline/problem?id=2967
利用Fibonacci判断数据范围进行优化设计。
http://online-judge.uva.es/p/v110/11089.html
Fi-binary numbers,Fibonacci进制。
http://www.mydrs.org/program/down/ahoi2004day1.pdf
第二题 数字迷阵   这些,是今天涉及到的资料和网页

转载于:https://www.cnblogs.com/Knuth/archive/2009/09/04/1559951.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux ssh密钥登录配置

首先确保服务器ssh服务已启动&#xff0c;用户能够正常登录&#xff0c;然后配置客户端&#xff0c;过程如下&#xff1a; 一、先用自已的用户登录到服务器&#xff0c;比如我用 uplinux 登录到服务器 二、运行 SSH Secure Shell 工具中的“Secure Shell Client ”&#xff0c;…

C++基础知识简答题

1、C 可执行程序的内存分布 BSS&#xff1a;Block Started by Symbol 存放程序中未初始化的全局变量 数据段&#xff1a; 存放已初始化的全局变量&#xff0c;静态内存分配 代码段&#xff1a; 存放执行代码 堆heap&#xff1a; 存放运行中动态分配的内存段&#xff0c;可扩张或…

linux驱动简单介绍

linux驱动简单介绍 驱动基本介绍 驱动。顾名思义就是“驱使硬件设备行动”。设备驱动与底层硬件之间打交道&#xff0c;按照硬件设备的具体操作方式来读写设备寄存器&#xff0c;最终完成一系列操作。 设备 驱动充当了应用程序和应用软件直接的纽带&#xff0c;它使得应用软件只…

远离客户陷阱小故事 转

出处&#xff1a; http://ilovecode.cnblogs.com 做项目做产品可以有3个境界&#xff1a;1 挣钱的&#xff0c;2 做品牌的&#xff0c;3 很酷的。有的人从境界1做到3&#xff0c;有得人从3做到1。 我是从1做到3&#xff0c;因为有了钱&#xff0c;你才能远离垃圾项目和不…

typename的作用

一、与class的区别 template声明式中&#xff0c;class和typename这两个关键字意义完全相同 template<class T> class Widget; template<typename T> class Widget; 二、什么时候要用typename&#xff1f;比如下面的代码 template <typename C> void …

[转]详细讲解提高数据库查询效率的实用方法、外键关于性能

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t w…

C语言 scanf()和gets()函数的区别

C语言 scanf()和gets()函数的区别 1.相同点&#xff1a;scanf( )函数和gets( )函数都可用于输入字符串 2.不同点&#xff1a;两者在功能上有所区别,具体区别如下&#xff1a; 要实现如下需求“从控制台输入字符串”有如下两种实现方式&#xff1a; 1>使用gets()函数实现使用…

静态链接库与动态链接库的区别

(1)、静态链接库&#xff1a;在链接阶段(生成可执行文件)将库函数全部载入到可执行文件中&#xff0c;可执行文件中包含了所有的库函数 优点&#xff1a;应用程序可以独立运行&#xff1b; 缺点&#xff1a;如果多次调用库中的函数&#xff0c;则该库函数会被调用多次 (2)、动…

用C语言实现SGF格式围棋棋谱解析器

这是本人&#xff08;liigo&#xff09;独立实现的SGF格式围棋棋谱文件解析器&#xff0c;本文介绍其实现细节。网络上肯定可以找到完善的开源的SGF解析器&#xff0c;这是毋庸置疑的&#xff0c;我不直接使用它们&#xff0c;也不参考它们的实现代码&#xff0c;而是自己独立编…

各种***方式说明

使消息保密的技术和科学叫做密码编码学&#xff08;cryptography&#xff09;。密码编码学是密码体制的设计学&#xff0c;即怎样编码&#xff0c;采用什么样的密码体制以保证信息被安全地加密。从事此行业的人员叫做密码编码者&#xff08;cryptographer&#xff09;。 与之相…

C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

C内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中&#xff0c;位于用户虚拟地址空间顶部的是用…

Uoj 441 保卫王国

Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题.设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]\sum f[v][1] ,f[u][1]w[u]\sum \min(f[v][0],f[v][1])​\) .现在要资瓷修改 \(x\) 的点权 \(w[x]\) ,容易发现修改后只会影响 \(x\) 到根节…

行存和列存的区别

写入&#xff1a; 行存储的写入是一次完成&#xff0c;数据的完整性因此可以确定。 列存储需要把一行记录拆分成单列保存&#xff0c;写入次数明显比行存储多。 行存储在写入上占有很大的优势 数据修改&#xff1a; 行存储是在指定位置写入一次&#xff0c;列存储是将磁盘定位…

javascript中的命名规则和方法

javascript变量名需要遵守两条简单的规则&#xff1a;1、第一个字符必须是字母、下划线&#xff08;_&#xff09; 或美圆符号&#xff08;$&#xff09;。2、余下的字符可以是下划线、美圆符号或任何字母或数字字符。 命名方法&#xff1a;1、Camel标记法——首字母是小写的&a…

jquery插件开发导读

最近发现项目中有些js代码可以重用&#xff0c;但是不知道怎么样组织&#xff0c;在网上调研后&#xff0c;发现jquery插件是一种很好的组织方式&#xff0c;而且项目也采用了jquery框架&#xff0c;所以花了点时间学习jquery插件开发&#xff0c;并且动手将部分项目代码转成jq…

C语言缓冲文件系统和非缓冲文件系统

C 语言所使用的磁盘文件系统有两大类&#xff1a;一类称为缓冲文件系统&#xff0c;又称为标准文件系统&#xff1b;另一类称为非缓冲文件系统。缓冲文件系统的特点是系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。从磁盘向内存读入数据时&#xff0c;则一次从磁盘…

Swift 里集合类型协议的关系

&#xfffc; &#xfffc; Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议&#xff0c;可以通过迭代来获取它的元素。 有两个关联类型&#xff1a; /// A type representing the sequences elements.associatedtype Element//…

ASP.NET 实现登录界面(生成验证码)

这周末也没干啥&#xff0c;真正开始ASP&#xff0c;做了个学籍管理系统的登录界面&#xff0c;登录界面主要包括用户名、密码、验证码&#xff0c;界面字体用了<font size"5" color"blue" font-family:"华文琥珀";></font>改变字体…

C/C++语言void及void指针深层探索

1.概述  许多初学者对C/C语言中的void及void指针类型不甚理解&#xff0c;因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说&#xff0c;并详述void及void指针类型的使用方法与技巧。2.void的含义  void的字面意思是“无类型”&#xff0c;void *则为“无…

多域资源整合之基础准备--DNS配置

由于公司的战略调整,需要整合集团内的资源,当然也也包含IT资源,我们需要评估多家公司的IT架构统一,顺利的合并到总集团的IT架构里,这也就产生一个多域的整合的一个案例,在此分享给大家,希望对大家有所帮助&#xff01;篇幅较长&#xff0c;让我们慢慢细化&#xff01; 在这次的…