斐波纳契数之组合 | ||||||
|
||||||
Description | ||||||
斐波那契数列是这么定义的:F0 = 1, F1 = 1, F2 = F1 + F0,··· Fn = Fn-1 + Fn-2(n>=2),对于每一项,它们都是斐波那契数。 现在给出一个整数d,求一个组合使得a + b + c = d,其中a、b、c 都是斐波纳契数,且a <= b <= c。 |
||||||
Input | ||||||
有多组测试数据,对于每组测试数据,仅包含一个整数d(0<=d<=2000000000)。 处理到文件结束,测试数据组数少于150组。 |
||||||
Output | ||||||
对于每组测试数据,输出一行,如果存在 a b c ,则输出最小字典序的组合,否则输出-1。 |
||||||
Sample Input | ||||||
3 4 5 0 |
||||||
Sample Output | ||||||
1 1 1 1 1 2 1 1 3 -1 |
||||||
Source | ||||||
计算机科学与技术学院2012级新生程序设计竞赛(正式赛) | ||||||
Author | ||||||
黄李龙@HRBUST |
#include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long LONG; int main() { LONG a[48]; a[0]=0; a[1]=1; int i; for(i=2;i<=47;i++) { a[i]=a[i-1]+a[i-2]; } LONG d; while(~scanf("%ld",&d)) { int j,k; int key=0; for(i=1;i<=47;i++) { for(j=1;j<=47;j++) { for(k=1;k<=47;k++) { if(a[i]+a[j]+a[k]==d) { key=1; printf("%ld %ld %ld ",a[i],a[j],a[k]); break; } } if(key) { break; } } if(key) { break; } } if(!key) { printf("-1 "); } } return 0; }