BZOJ.2660.[BJOI2012]最多的方案(DP)
首先我们知道:

也很好理解。如果相邻两项出现在斐波那契表示法中,那它们显然可以合并。
所以我们能得到\(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)的更多相关文章
- [CF126D]Fibonacci Sums/[BJOI2012]最多的方案
[CF126D]Fibonacci Sums/[BJOI2012]最多的方案 题目大意: 将\(n(n\le10^9)\)表示成若干个不同斐波那契数之和的形式,求方案数. 思路: 如果不考虑\(0\) ...
- BJOI2012 最多的方案
BJOI2012 最多的方案 Description 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数 ...
- [luogu4133 BJOI2012] 最多的方案 (计数dp)
题目描述 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一些斐波那契数的 ...
- [BJOI2012]最多的方案(记忆化搜索)
第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一些斐波那契数的和的形式. ...
- 洛谷 [BJOI2012]最多的方案
洛谷 这题是旁边同学介绍的,听他说记忆化搜索可以过... 不过我还是老老实实的想\(dp\)吧- 先看看数据范围,\(n\leq10^{18}\)相当于\(n \leq fib[86]\). 以前打\ ...
- 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)
题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的 ...
- bzoj2660最多的方案——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 首先,多种方案的出现是因为一个较大的斐波那契数可以变成两个较小的: 用一个01串来表示 ...
- bzoj2660最多的方案
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 当然可以看出 选了第 i 个斐波那契数<=>选了第 i - 1 和第 i ...
- bzoj2660: [Beijing wc2012]最多的方案
题目链接 bzoj2660: [Beijing wc2012]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...
随机推荐
- Python基础数据类型-字典(dict)
Python基础数据类型-字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版本的哟 ...
- np.random.choice方法
np.random.choice方法 觉得有用的话,欢迎一起讨论相互学习~Follow Me def choice(a, size=None, replace=True, p=None) 表示从a中随 ...
- LVS原理详解(3种工作模式及8种调度算法)
2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法) LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong 发布日期: ...
- 原生JS不到30行,实现类似javascript MVC的功能-minTemplate
严格来讲不能说是MVC,应为模版里不能写逻辑语句. 灵感来源于我的上篇文字:<封装JSON数据转自定义HTML方法parseHTML>: 这里再封装一个简单方法,在保持原来的方便改变不大的 ...
- java concurrent 中ExecutorService和CompletionService简单区别
举个例子,现在需要执行10个任务,这些任务都是有返回值,并且需要使用10个线程同时执行.一般的做法就是创建ExecutorService线程池,pool大小10,每个任务实现Callable接口,然后 ...
- NOI2001 方程的解数(双向搜索)
solution 一道非常经典的双向搜索题目,先将前3个未知数枚举一遍得到方程的前半部分所有可能的值,取负存入第一个队列中再将后3个未知数枚举一遍,存入第二个队列中.这样我们只要匹配两个队列中相同的元 ...
- click模块使用
# coding:utf8 import time import click @click.command() @click.option('--id', default='123', help='a ...
- Codeforces 600E - Lomsat gelral 「$Dsu \ on \ tree$模板」
With $Dsu \ on \ tree$ we can answer queries of this type: How many vertices in the subtree of verte ...
- 001_docker-compose构建elk环境
由于打算给同事分享elk相关的东西,搭建配置elk环境太麻烦了,于是想到了docker.docker官方提供了docker-compose编排工具,elk集群一键就可以搞定,真是兴奋.好了下面咱们开始 ...
- Selenium WebDriver如何模拟复制和粘贴
以最简单的例子来说明,我们需要在bing搜索引擎中,输入并查询“Selenium自动化测试”几个字.可以很快就写出如下代码: String queryString = "Selenium自动 ...