题目链接

首先我们知道:



也很好理解。如果相邻两项出现在斐波那契表示法中,那它们显然可以合并。

所以我们能得到\(n\)的斐波那契表示,记\(pos[i]\)为\(n\)的斐波那契表示法中,第\(i\)项在原斐波那契的下标,那么:\(n=\sum_{i=1}^{cnt}F[pos[i]]\)。

如果方案中不直接存在\(F[pos[i]]\)(把\(F[pos[i]]\)分解),那它只能由\(<pos[i]\)的项构成。于是我们考虑递推。

\(f[i][1/0]\)表示当前考虑到\(pos[i]\),是/否分解\(F[pos[i]]\),且满足\(F[pos[1]]\sim F[pos[i]]\)都被组成,的方案数。

如果不分解\(F[pos[i]]\),那么有$$f[i][0]=f[i-1][0]+f[i-1][1]$$,且\(F[pos[i+1]]\)只能由\([pos[i]+1,pos[i+1]]\)之间的项得到。

如果分解\(F[pos[i]]\),则\(F[pos[i+1]]\)可以由\([pos[i],pos[i+1]]\)之间的项得到,而且若分解\(F_i=F_{i-1}+F_{i-2}\),下一次只能分解\(F_{i-2}=F_{i-3}+F_{i-4}\),再下一次只能分解\(F_{i-4}=\ldots\ldots\)。于是我们可以得到在区间\([l,r-1]\)中分解\(F_r\)的方案数为\(\frac{r-l}{2}\)。

于是可以得到:$$f[i][1]=f[i-1][0]\times\frac{pos_i-pos_{i-1}-1}{2}+f[i-1][1]\times\frac{pos_i-pos_{i-1}}{2}$$

初始值就是\(f[1][0]=1,f[1][1]=\frac{pos_i-1}{2}\)。

另外直接map记搜也能跑得飞快(甚至比递推快smg。。)

#include <cstdio>
#include <algorithm>
typedef long long LL;
const int N=100; int p[N],f[N][2];
LL n,F[N]; int main()
{
scanf("%lld",&n);
F[1]=1, F[2]=2; int t,cnt=0;
for(t=3; (F[t]=F[t-1]+F[t-2])<=n; ++t);
for(int i=t; i; --i)
if(n>=F[i]) n-=F[i], p[++cnt]=i;
std::reverse(p+1,p+1+cnt); f[1][0]=1, f[1][1]=p[1]-1>>1;
for(int i=2; i<=cnt; ++i)
f[i][0]=f[i-1][0]+f[i-1][1],
f[i][1]=f[i-1][0]*(p[i]-p[i-1]-1>>1)+f[i-1][1]*(p[i]-p[i-1]>>1);
printf("%d\n",f[cnt][0]+f[cnt][1]); return 0;
}

BZOJ.2660.[BJOI2012]最多的方案(DP)的更多相关文章

  1. [CF126D]Fibonacci Sums/[BJOI2012]最多的方案

    [CF126D]Fibonacci Sums/[BJOI2012]最多的方案 题目大意: 将\(n(n\le10^9)\)表示成若干个不同斐波那契数之和的形式,求方案数. 思路: 如果不考虑\(0\) ...

  2. BJOI2012 最多的方案

    BJOI2012 最多的方案 Description ​ 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数 ...

  3. [luogu4133 BJOI2012] 最多的方案 (计数dp)

    题目描述 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一些斐波那契数的 ...

  4. [BJOI2012]最多的方案(记忆化搜索)

    第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一些斐波那契数的和的形式. ...

  5. 洛谷 [BJOI2012]最多的方案

    洛谷 这题是旁边同学介绍的,听他说记忆化搜索可以过... 不过我还是老老实实的想\(dp\)吧- 先看看数据范围,\(n\leq10^{18}\)相当于\(n \leq fib[86]\). 以前打\ ...

  6. 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)

    题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的 ...

  7. bzoj2660最多的方案——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 首先,多种方案的出现是因为一个较大的斐波那契数可以变成两个较小的: 用一个01串来表示 ...

  8. bzoj2660最多的方案

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 当然可以看出  选了第 i 个斐波那契数<=>选了第 i - 1 和第 i ...

  9. bzoj2660: [Beijing wc2012]最多的方案

    题目链接 bzoj2660: [Beijing wc2012]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...

随机推荐

  1. 如何把手机app的视频下载到手机上?网页上的视频怎么下载?

    手机上小视频怎么下载?求推荐不需要安装软件的下载方法? 如何把手机app的视频下载到手机上?比如把快手上的视频下载到手机上? 如何免费下载视频? ... 答案当然是用iiiLab提供的在线视频解析下载 ...

  2. bzoj千题计划286:bzoj1226: [SDOI2009]学校食堂Dining

    http://www.lydsy.com/JudgeOnline/problem.php?id=1226 关键点:一个人只能忍受 ‘紧跟’ 在他 后面的b个人比他先打到饭 dp[i][j][k] 前i ...

  3. JS中一些常用的事件(笔记)

    window.onload事件:当文档和其所有外部资源(如图片)完全加载并显示给用户时就会触发它. window.onload = function (){ //当加载完当前页面和其所有外部资源(如图 ...

  4. mysql 创建用户自定义函数

    为了防止分号产生的中途输出,自己定义一个 分隔符,这里仿照mysql官方的例子:使用两个美元符号 $$ 作为分割符号,下面这段代码就是创建一个自定义mysql函数的原型了,可以在这个基础上修改,这样, ...

  5. 编写 grunt 插件经验

    第一步: 先生成插件模板: 利用命令生成, 首先通过github工具获取gruntplugin模板文件: 第二步: 了解plugin/tasks/taskName.js的registerMultiTa ...

  6. Linux - ssh 连接慢解决

    解决 ssh 链接慢 sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config sed -i ...

  7. 第13月第10天 swift3.0

    1. Type 'Any' has no subscript members 这一条简直莫名其妙.大体意思就是,你这个类型"Any"不是个数组或者字典,不能按照下标取东西. 我之前 ...

  8. Java Service Wrapper将java程序设置为服务

    有时候我们希望我们java写的程序作为服务注册到系统中,Java Service Wrapper(下面简称wrapper)是目前较为流行的将Java程序部署成Windows服务的解决方案, 本文将讨论 ...

  9. TCP长连接和短连接的区别【转】

    转自:https://www.cnblogs.com/onlysun/p/4520553.html 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接, ...

  10. Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

    原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://bl ...