BJOI2012 最多的方案

Description


​ 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数。现在给一个正整数N,它可以写成一些斐波那契数的和的形式。如果我们要求不同的方案中不能有相同的斐波那契数,那么对一个N最多可以写出多少种方案呢?

Input


​ 只有一个整数N。

Output


​ 一个方案数

Sample Input


​ 16

Sample Output


​ 4

HINT


Hint:16=3+13=3+5+8=1+2+13=1+2+5+8

对于30%的数据,n<=256

对于100%的数据,n<=10^18

Solution


有一个数学结论:第i个斐波那契数 拆成别的互不相同的斐波那契数表示,最多有(i-1)/2 种。那么我们用贪心,找出这个给出的数分解成斐波那契数的一个方案,再递推求解。

Code


//Writer : Hsz %WJMZBMR%tourist%hzwer
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;
LL p[100],num;
LL n,fi[100],cnt,ans;
void fib(int x) {
if(fi[x-1]>n) {
cnt=x-1;
return;
}
fi[x]=fi[x-1]+fi[x-2]; fib(x+1);
}
LL f[105][2];//第i个fib,拆分/不拆 方案数。
int main() {
cin>>n;
fi[0]=fi[1]=1;
fib(2);
for(int i=cnt; i; i--) {
if(n>=fi[i]) n-=fi[i],p[++num]=i;
}
sort(p+1,p+1+num);
f[1][1]=1;f[1][0]=(p[1]-1)/2;
for(int i=2; i<=num; i++) {
f[i][1]=f[i-1][1]+f[i-1][0];
f[i][0]=((p[i]-p[i-1]-1)/2)*f[i-1][1]+((p[i]-p[i-1])/2)*f[i-1][0];//整个表示不能有重复的数。
}
cout<<f[num][0]+f[num][1];
return 0;
}

最新文章

  1. iOS-----Xcode-Debug尝试
  2. php连接多数据库
  3. Distributed Result Grouping Caveats
  4. 烂泥:ubuntu中使用virt-manager图形化新建虚拟机
  5. 【原创】linux命令bc使用详解
  6. Quora图片懒加载
  7. HTTP Authorization
  8. asp.net 面试基础题
  9. Oracle AWR 报告详解
  10. PL SQL Developer报错框乱码
  11. SQL 结合CASE WHEN 实现二维统计
  12. Hbase的集群安装
  13. C++多线程同步技巧(三)--- 互斥体
  14. python 全栈开发,Day52(关于DOM操作的相关案例,JS中的面向对象,定时器,BOM,client、offset、scroll系列)
  15. SQL server学习(五)T-SQL编程之存储过程
  16. Java执行js代码
  17. django中使用mysql数据库的事务
  18. 二叉堆的实现(数组)——c++
  19. 【弱省胡策】Round #0 Flower Dance DP
  20. Oracle密码忘记了解决办法

热门文章

  1. IOS - 查找未使用的图片
  2. HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)
  3. 2.【SELinux学习笔记】概念
  4. C语言学习笔记:15_c语言中的进制操作.c
  5. 自己主动化的在程序中显示SVN版本号
  6. mysql选择上一条、下一条数据记录,排序上移、下移、置顶
  7. Python查询数据库,中文的结果显示不出来
  8. 如何做URL静态化 和页面的静态化
  9. ueditor1.4.3在.net环境下的vs开发工具中集成经验
  10. luogu1969 积木大赛