标签:
看到这个标题,貌似很高大上的样子= =,其实这个也是大家熟悉的东西,先给大家科普一下斐波拉契数列。
又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
有趣的是:这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618.(或者说后一项与前一项的比值小数部分越来越逼近黄金分割0.618、前一项与后一项的比值越来越逼近黄金分割0.618)
n
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
…
|
斐波那契数列F(n)
|
1
|
1
|
2
|
3
|
5
|
8
|
13
|
21
|
34
|
55
|
…
|
卢卡斯数列L(n)
|
1
|
3
|
4
|
7
|
11
|
18
|
29
|
47
|
76
|
123
|
…
|
F(n)*L(n)
|
1
|
3
|
8
|
21
|
55
|
144
|
377
|
987
|
2584
|
6765
|
…
|
1 //斐波拉契-卢卡斯数列 2 //Memory 1100 K,Time: 234 Ms 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 #define INF 0x3f3f3f3f 10 11 int m1,m2; //让第二项最小的初始两项 12 13 //计算初始两项并刷新最适合的m1,m2 14 void compute(int a,int b,int t) 15 { 16 while(t <= a && t >= 1) 17 { 18 b = a; 19 a = t; 20 t = b - a; 21 } 22 if(m2 > b) 23 { 24 m1 = a; 25 m2 = b; 26 } 27 } 28 29 int main() 30 { 31 int T,n; 32 scanf("%d",&T); 33 34 while(T--) 35 { 36 int a,t; 37 scanf("%d",&n); 38 a = (int)(0.618*n)-1; //倒数第二项模糊值 39 40 m1 = m2 = INF; 41 int i = -1; 42 while(a+(++i) <= n && i <= (int)2*sqrt(n)) //倒数第二项小于最后一项,且次数小于2*sqrt(n) 43 { 44 compute(a+i,n,n-a-i); 45 } 46 47 printf("%d %d\n",m1,m2); 48 } 49 50 return 0; 51 }
上述Code的 i <= (int)2*sqrt(n)的不等式是小编试出来的,测试数据在这些次数内可以过,如果不加的话,肯定是TLE的。
大家如果有更加合适的Code可以写在评论里面(⊙o⊙)哦~,小编太渣了,没有更加清楚明白的思路= =
Fighting~
ACM/ICPC算法训练 之 数学很重要—斐波拉契●卢卡斯数列(HNNUOJ 11589)
标签:
原文地址:http://www.cnblogs.com/Inkblots/p/4729632.html