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]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...
随机推荐
- SQL记录-PLSQL触发器
PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...
- SQL语句(十四)子查询
--1. 使用IN关键字 --例1 查询系别人数不足5人的系别中学生的学号.姓名和系别 --系别人数不足5人的系别 ==>选择条件 select Sdept from Student Group ...
- Java Message Service学习(一)
一,背景 近期需要用到ActiveMQ接收Oozie执行作业之后的返回结果.Oozie作为消息的生产者,将消息发送给ActiveMQ,然后Client可以异步去ActiveMQ取消息. ActiveM ...
- Jquery 较好的效果
仿google图片效果图片展示相册(jquery)的演示页面 产品相册展示插件slideshow多图可翻页 懒人建站 Jquery分享A Jquery分享B Jquery分享C Jquery分享D
- Android利用LocalSocket实现Java端进程与C端进程之间的IPC
Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...
- CentOS配置源
一.源列表 aliyun源 #各系统版本repo文件对应的下载操作 CentOS wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.al ...
- 【linux kernel】 中断处理-中断下半部【转】
转自:http://www.cnblogs.com/embedded-tzp/p/4453987.html 欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地 ...
- reportng之测试报告升级美化
背景:偶然看到一个人的自动化框架的测试报告好漂亮,心痒痒,今天弄了一下午,还是不行,结果到现在就现在,我特么成功了,不为什么 Mark一下: 本地化修改 获取源码,修改reportng.propert ...
- numpy和pandas简单使用
numpy和pandas简单使用 import numpy as np import pandas as pd 一维数据分析 numpy中使用array, pandas中使用series numpy一 ...
- LeetCode(21):合并两个有序链表
Easy! 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1- ...