博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ural 1133. Fibonacci Sequence
阅读量:5167 次
发布时间:2019-06-13

本文共 2206 字,大约阅读时间需要 7 分钟。

题目链接:

problem description:

Problem illustration

is an infinite sequence of integers that satisfies to Fibonacci condition
F
i + 2 = 
F
i + 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·10
9
Fk ≤ 2·10
9 (
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:
F
3 = 5,
F
−1 = 4; you asked to find the value of
F
5. The following Fibonacci sequence can be reconstructed using known values:
…,
F
−1 = 4,
F
0 = −1,
F
1 = 3,
F
2 = 2,
F
3 = 5,
F
4 = 7,
F
5 = 12, …
Thus, the answer is:
F
5 = 12.
 
解题分析:
对于fibonacci序列a,X0,X1,X2。。。。。b。假设这个序列是存在的。X是代表哪些未知的数。要如何才能判断这个序列是有解的呢?
给定a,b的值。枚举x0然后去确定b的那个空要填什么数,如果该数等于b那么就找到了解。然而貌似每次这样循环找速度会很慢的。fibonaccig公式
f[i] = f[i-1] + f[i-2]  线性方程,可以用矩阵来优化求第n项。
[f[1], f[0]] *[
11
01] = [f[2], f[1]],  令unit = [
11 
0 
1] , 求第n项,则先求矩阵ret = [f[1], f[0]] * unit^(n-1)
1 def matrixMul(a, b): 2     c = [[0 for i in xrange(2)] for j in xrange(2)] 3     for i in xrange(2): 4         for j in xrange(2): 5             for k in xrange(2): 6                 c[i][j] += a[i][k]*b[k][j] 7     return c 8  9 def POW(unit, x):10     a = unit; b = [ [1, 0], [0, 1] ] 11     while x>0:12         if x&1:13             b = matrixMul(b, a)14         a = matrixMul(a, a)15         x >>= 116     return b17 18 def work(i, a, j, b, n):19     unit = [ [1, 1], [1, 0] ]20     mat = POW(unit, j-1)21     l = -2000000000; r = 2000000000; mid = -122     while l<=r:23         mid =(l+r)>>124         tmp = mid*mat[0][0]+a*mat[1][0]25         if tmp > b:  r = mid-126         elif tmp < b: l = mid+127         else :  break28     mat = POW(unit, n-1)29     print mid*mat[0][0]+a*mat[1][0] if n>0 else a30     31 if __name__ == '__main__':32     i, a, j, b, n = map(int, raw_input().split())33     if i > j:34         tmp = i; i = j; j = tmp35         tmp = a; a = b; b = tmp;36     j -= i; n -= i; i=037     work(i, a, j, b, n)
View Code

 

转载于:https://www.cnblogs.com/TengXunGuanFangBlog/archive/2013/05/17/fibonacci_sequence.html

你可能感兴趣的文章
C#里如何遍历枚举所有的项
查看>>
如何在键盘出现时滚动表格,以适应输入框的显示
查看>>
超级强大的鼠标手势工具
查看>>
常用Dockerfile举例
查看>>
jquery的ajax用法
查看>>
设计模式-策略模式(Strategy)
查看>>
django orm 数据查询详解
查看>>
JarvisOJ Basic 熟悉的声音
查看>>
C# list导出Excel(二)
查看>>
CAS 单点登录模块学习
查看>>
Android应用开发-网络编程①
查看>>
input中的name,value以及label中的for
查看>>
静态库制作-混编(工程是oc为基础)
查看>>
jQuery 显示加载更多
查看>>
Confluence 6 系统运行信息中的 JVM 内存使用情况
查看>>
Confluence 6 升级以后
查看>>
用JS实现版面拖拽效果
查看>>
二丶CSS
查看>>
《avascript 高级程序设计(第三版)》 ---第二章 在HTML中使用Javascript
查看>>
JS一些概念知识及参考链接
查看>>