题目描述

给出一个正整数x,问x最少能由多少个Fibonacci数加减算出。
例如1070=987+89-5-1,因此x=1070时答案是4。

输入

第一行一个正整数q (q<=10),表示有q组输出。
下面q行每行一个正整数x (x<=4*10^17)。

输出

输出q行,依次表示每个输出的答案。

样例输入

1
1070

样例输出

4
 
  因为f[i]=f[i-1]+f[i-2],f[i+1]=f[i]+f[i-1],能得到2f[i]=f[i+1]+f[i-2],所以最优答案一定存在没有一个FIB数被选两次的情况。预处理出FIB数,每一次二分找到最大的小于等于x的FIB数和最小的大于等于x的FIB数,然后求出差的绝对值,递归绝对值小的。至于为什么每次都取最接近x的,这样可以使递归要找的数更小,使答案更优。为什么每次要选最接近x的数?因为我们知道FIB数每一项等于前两项之和,如果每一次不选最大的,因为每一次选的都是越来越小的,那么要想加和等于能选的最大的,就要更多次数。
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
long long f[600];
long long cnt=1;
int t;
long long x;
long long findL(long long x)
{
int l=1;
int r=cnt;
int ans=1;
while(l<=r)
{
if(f[mid]<=x)
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
return f[ans];
}
long long findR(long long x)
{
int l=1;
int r=cnt;
int ans=1;
while(l<=r)
{
if(f[mid]>=x)
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
return f[ans];
}
int find(long long x)
{
long long l=findL(x);
long long r=findR(x);
if(l==r)
{
return 1;
}
if(x-l<=r-x)
{
return find(x-l)+1;
}
else
{
return find(r-x)+1;
}
}
int main()
{
f[0]=f[1]=1;
while(f[cnt-1]<=4e17)
{
f[++cnt]=f[cnt-1]+f[cnt-2];
}
scanf("%d",&t);
while(t--)
{
scanf("%lld",&x);
printf("%d\n",find(x));
}
}

最新文章

  1. WinForm 进程、线程、TreeView递归加载、发送邮件--2016年12月13日
  2. Java Interview Test
  3. 转发!HTML 复选框 checkbox 的 JavaScript 的全选和全反选
  4. linux socket
  5. PAT (Basic Level) Practise:1028. 人口普查
  6. Jrebel6.3.3破解,配置图文教程
  7. Ip 地址
  8. 域名的MX设置及校验方法
  9. (转载)利用burp suite截断上传拿shell
  10. indexOf()不区分大小写用法
  11. 在UE4中使用SVN作为source control工具
  12. C# DataGridView中DataGridViewComboBoxCell列,下拉框事件的处理【完美解决】
  13. STL之map排序
  14. Linux i2c 读写程序
  15. .net core通过发布nuget实现引用项目
  16. Junit测试用例
  17. css的postion属性
  18. jquery中data()和js中dataset属性的区别
  19. JSTL标签库学习记录1-c
  20. bzoj 1211: [HNOI2004]树的计数

热门文章

  1. 【SPOJ GSS】数据结构题选做
  2. 利用 ProtoThreads实现Arduino多线程处理(1)
  3. exec sp_spaceused如何只返回一个结果集(转载)
  4. 一篇自己都看不懂的CDQ分治&amp;整体二分学习笔记
  5. c# create html table test
  6. Luogu P2602 [ZJOI2010]数字计数
  7. Spring Boot(十六):使用 Jenkins 部署 Spring Boot
  8. Android 安全退出应用程序的方法总结
  9. Linux ip forward
  10. openssl版本升级操作记录