L - 菲波拉契数制升级版

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

我们定义如下数列为菲波拉契数列:

F(1)=1

F(2)=2

F(i)=F(i−1)+F(i−2)(i>=3)

给定任意一个数,我们可以把它表示成若干互不相同的菲波拉契数之和。比如13有三种表示法

13=13

13=5+8

13=2+3+8

现在给你一个数n,请输出把它表示成若干互不相同的菲波拉契数之和有多少种表示法。

Input

第一样一个数T,表示数据组数,之后T行,每行一个数n。

T≤105

1≤n≤1018

Output

输出T行,每行一个数,即n有多少种表示法。

Sample input and output

Sample Input Sample Output
6
1
2
3
4
5
13
1
1
2
1
2
3

解题思路:

首先高位到低位贪心得到基础情况(最好,因为留了最多的操作空间)

dp(i,j) 表示正在决策第 i 位 ( 后面的已经决策完毕 ),且是否取 0->不取,1->取

dp(i,1) = dp(i-1,0) + dp(i-1,1) //取,转移到i-1

不取,那么这一位斐波那契由前面的相加得到

前面一位取了: 因为不能有相同,所以只能分解成 (x-1) / 2 (少了个0) 种情况( x 是前面0的个数 ) -> 00001  -- 00110 -- 11010

前面一位没取: 因为不能有相同,所以只能分解成 x / 2 种情况.

dp(i,0) = dp(i-1,1) *(A-1) + dp(i-1,0) * A;

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
typedef long long ll;
using namespace std;
const int maxn = ;
ll f[maxn];
int dp[maxn][];
vector<int>st; void init_f()
{
f[] = , f[] = , f[] = ;
for(int i = ; i <= ; ++ i)
f[i] = f[i-] + f[i-];
} int main(int argc , char *argv[])
{
init_f();
int Case;
scanf("%d",&Case);
while(Case--)
{
st.clear();
memset(dp,,sizeof(dp));
ll beg;
scanf("%lld",&beg);
int pos = ;
while(beg)
{
if (beg >= f[pos]) // Choose
{
st.pb(pos);
beg -= f[pos];
}
pos--;
}
st.pb();
reverse(st.begin(),st.end()); //高位到低位dp
dp[][] = ; //初始化最高位取1有一种情况.
for(int i = ; i < st.size() ; ++ i)
{
dp[i][] = dp[i-][] + dp[i-][];
int zeronum = st[i] - st[i-] ;
dp[i][] = dp[i-][] * ( (zeronum-) / ) + dp[i-][] * (zeronum / ); //注意加括号,不然出问题!
}
printf("%d\n",dp[st.size()-][] + dp[st.size()-][]);
}
return ;
}

UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>的更多相关文章

  1. UESTC_菲波拉契数制 2015 UESTC Training for Dynamic Programming<Problem E>

    E - 菲波拉契数制 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. [dp][uestc]L - 菲波拉契数制升级版

    数据很大,以背包的思路数组开不下. 先定序地考虑一个菲波拉契数如fib(i)的表示法,假设i比较大,由菲波拉契数的定义可知道fib(i)=fib(i-1)+fib(i-2);要找到其它表示就继续拆分f ...

  3. UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>

    K - 摩天轮 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  4. UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>

    O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  5. UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  6. UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>

    M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  7. UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  8. UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>

    I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  9. UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>

    H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

随机推荐

  1. WIN8共享文件 详细设置

    原文地址:http://jingyan.baidu.com/article/75ab0bcbff4274d6864db2f5.html win8共享文件设置 详细教程 | 浏览:6987 | 更新:2 ...

  2. Inorder Successor in BST 解答

    Question Given a binary search tree and a node in it, find the in-order successor of that node in th ...

  3. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅰ

    3.1符号表 符号表最主要的目的就是将一个键和一个值联系起来.用例能够将一个键值对插入符号表并希望在之后能够从符号表的所有键值对中按照键值姐找到对应的值.要实现符号表,我们首先要定义其背后的数据结构, ...

  4. 学习Swift中的CoreImage(图形核心编程)

    Core Image是一个可以让你轻松使用图形过虑器的强力框架.在这里你几乎可以获得所有不同种类的效果,比如修改图像饱和度,色彩范围,亮度等.它甚至也可以利用CPU或者GPU来处理图像数据并且它的速度 ...

  5. Qt Assistant 的配置文件qhp--->qch 和qhcp--->qhc详解与生成

      Qt Assistant 这个exe文件可以被我们利用到我们自己的程序为我们添加help,是一个文档浏览器,它的搜索功能,还有最主要的就是他可以让客户自己定义自己索要显示的文档,也就是qch文档. ...

  6. UISegmentedControl判断点击第几项

    UISegmentedControl 关于UISegmentedControl判断当前点击的是第几项,找了很久,终于再老外的博客上找到了,在委托中 UISegmentedControl *Seg=se ...

  7. docker四种网络模式

    1,host模式 启动容器时,添加参数--net=host 此模式和宿主机使用的是同1个ip,适合上网. 2,container模式 启动容器时,添加参数--net=container,docker ...

  8. Ext Radio 取消选中

    今天,做项目的时候遇到了要吧Ext Radio单选按钮取消选中状态,由于没有在formpanel中写, 导致不能用reset()方法,试了各种方法,最后这样写管用. radio1.setValue(f ...

  9. alarm函数可以定时

    貌似是可以的,不过感觉好像这样用不是很好,最好还是用回timer_settimer一些列函数吧,不过既然开了头,就看下alarm怎么用吧. 1. 所需头文件  #include<unistd.h ...

  10. QT错误:collect2:ld returned 1 exit status

    1.编译成功的例子在后台执行,有时一闪而过,如果再次build ,则会提示上述错误. 解决方法:打开任务管理器,找到相应的exe进程,关闭即可:  或者直接关闭QtCreator. 2.没有编译成功的 ...