1133. Fibonacci Sequence
Time limit: 1.0 second
Memory limit: 64 MB
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: i, Fi, j, Fj, n.
−1000 ≤ i, j, n ≤ 1000, i ≠ j,
−2·109 ≤ Fk ≤ 2·109 (k = min(i, j, n), …, max(i, j, n)).
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
Tags: number theory ( hide tags for unsolved problems )
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]