斐波那契数列 1133. Fibonacci Sequence

1133. Fibonacci Sequence

Time limit: 1.0 second
Memory limit: 64 MB
Problem illustration
is an infinite sequence of integers that satisfies to Fibonacci condition Fi + 2 = Fi + 1 + Fi for any integer i. Write a program, which calculates the value of Fn for the given values of Fi and Fj.

Input

The input contains five integers in the following order: iFijFjn.
−1000 ≤ ijn ≤ 1000, i ≠ j,
−2·109 ≤ Fk ≤ 2·109 (k = min(ijn), …, max(ijn)).

Output

The output consists of a single integer, which is the value of Fn.

Sample

input output
3 5 -1 4 5
12

Hint

In the example you are given: F3 = 5, F−1 = 4; you asked to find the value of F5. The following Fibonacci sequence can be reconstructed using known values:
…, F−1 = 4, F0 = −1, F1 = 3, F2 = 2, F3 = 5, F4 = 7, F5 = 12, …
Thus, the answer is: F5 = 12.
Problem Source: Quarterfinal, Central region of Russia, Rybinsk, October 17-18 2001



Fibonacci数列是我从高中开始就接触,并喜欢上的数列.  经典的递归. 动态规划类涉及题目. 


这里更特殊一点, 不过是在原有的Fibonacci作了变动. 

试想 j 是一个比i大一些数.   
    
F(i+2) = F(i)+F(i+1)          =  >  将 F(i+1) , F(i) 记作向量 FF.  f[i] 表示正规Fibonacci数列 f1=1 f2=1 f3=2, .... 因此左侧等式都可以写成一个系数向量与FF内积的形式
                                     = (f2,f1) FF  
F(i+3) = 2F(i+1)+F(i)        =(f3,f2) FF
F(i+4) = 3F(i+1) + 2F(i)    =(f4,f3) FF
F(i+5) = 5(i+1) + 3F(i)      =(f5,f4) FF
...
...
F(i+d) =    ..     =(fd,f(d-1))* FF


所以当 j与i差距较大时, F(i)与F(j)它们的递归关系可以用两个连续的Fibonacci系数内积来表示. 

 >> 实际上 如果用高等代数欧氏空间去理解,   FF = (F(i+1), F(i) )   可以视作是此二维空间的一个  基. 
  此空间中所有的数值都可以用这个基来表示,  表示向量 (a,b)  实际上 可表达为( a= f(k+1), b=f(k) )  所以表示向量是Fibonacci 数列中的项数k的函数.  


j - i 差距 用d来表示 ( 如果输入的 i 为较大者 交换两对数值顺序) 

1<=d < = 3 

    d = 1,    i,j |  Fi, Fj 本身就是空间中的基,  Fn 可直接由其表示; 
    d = 2\3,    i j | Fi, Fj  可简单推导出  Fi F(i+1) 

d > 3 

   首先 计算好待用的Fibonacci系数.   原题中对i j 大小限制为 :   -1000, 1000 因此d上限为2000.  因此 准备的第一个数组f 为
  f = Array.new(2001,0) ;  f[1]= 1 f[2] = 1   3.upto(d).each {|k| f[k] = f[k-1]+ f[k-2] }

Fj = F(i+d) ,  Fj - Fi * f(d-1) =  F(i+1)  *  fd , 目的是求 F(i+1)    ==>

b = ( ( Fj - f[d-1] *Fi)/f[d] ).floor ( 确定为整数)      实际上 上述所做努力就是为了得到这组基: 

   F(i)   F(i+1) 


接下来对n进行分类讨论 用另一组数组 a[] 来计算 存储结果.   
a[i] = F(i)  a[i+1] = F(i+1)  

n > i
  从i到n 增向循环, 计算 a[n] 
  

n < i  
   从n到i 减向循环, 计算 a[n]  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值