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. bzoj1755 [Usaco2005 qua]Bank Interest

    Description Farmer John made a profit last year! He would like to invest it well but wonders how muc ...

  2. <转载>C++命名空间

    原文http://blog.csdn.net/liufei_learning/article/details/5391334 一. 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由 ...

  3. Live555 分析(二):服务端

    live555支持单播和组播,我们先分析单播的流媒体服务端,后面分析组播的流媒体服务端. 一.单播的流媒体服务端: // Create the RTSP server: RTSPServer* rts ...

  4. 同一个页面多个CALayer重绘的办法

    //知识点,CALayer的重绘,-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 方法,CALayer的渐变色.多个CALa ...

  5. 利用Python进行数据分析——数据规整化:清理、转换、合并、重塑(七)(1)

    数据分析和建模方面的大量编程工作都是用在数据准备上的:载入.清理.转换以及重塑.有时候,存放在文件或数据库中的数据并不能满足你的数据处理应用的要求.很多人都选择使用通用编程语言(如Python.Per ...

  6. 部分GDAL工具功能简介

    主要转自http://blog.csdn.net/liminlu0314?viewmode=contents 部分GDAL工具功能简介 gdalinfo.exe 显示GDAL支持的各种栅格文件的信息. ...

  7. java加载资源文件

    className.class.getResourceAsStream 用法: 第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类Test.class ,同时有资源文件c ...

  8. UIView的动画之初步学习

    animateWithDuration:<#(NSTimeInterval)#> delay:<#(NSTimeInterval)#> options:<#(UIView ...

  9. mysql设置字体

    如果在linux下重启mysql服务的时候出现Job failed to start,在window下重启失败,这是因为你安装了高版本的mysql(mysql5.5以上),在高版本对字符编码方式修改的 ...

  10. Android 6.0 闪光灯的使用

    Android6.0 已经抛弃了Camer 相关的API,改用新的API接口CamerManager,下面给出使用的简单实例 package com.inper.duqiang.slashlight; ...