洛谷 [BJOI2012]最多的方案
这题是旁边同学介绍的,听他说记忆化搜索可以过。。。
不过我还是老老实实的想\(dp\)吧~
先看看数据范围,\(n\leq10^{18}\)相当于\(n \leq fib[86]\)。
以前打\(cf\)的时候做过一个题目,好像证明过任何数都可以用斐波那契数组成。
不过现在忘记证了。。。
但是刚好这个可以派上用场,先假设\(p[i]\)代表组成\(n\)的第\(i\)个斐波那契数的位置。
另外,还有一个性质我们也需要分析出来。
因为\(fib[i]=fib[i-1]+fib[i-2]\),所以每个斐波那契数都可以有两种选择。
选择分裂,或不分裂。
那么我们令\(f[i][0/1]\)代表枚举到第\(i\)个组成\(n\)的斐波那契数此时的方案数。
0是不分裂,1是分裂。
所以状态这么转移:
\]
\]
为什么呢?
\(f[i][0]\)很显然,不用说。
对于\(f[i][1]\),第\(i\)位分裂,显然它前面有\(p[i]-p[i-1]>>1\)个方案是\(f[i-1][1]\)(分裂)的。
而前面的\(f[i-1][0]\)如果是不分裂,那么方案\(-1\)。
那么代码(复杂度\(O(86)\)):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll a[86]={0,1,2},f[86][2]={};
ll n,p[86]={},cnt;
cin>>n;
for (int i=3;i<=85;++i)
a[i]=a[i-1]+a[i-2];
for (int i=85;i;--i)
if (n>=a[i])
n-=a[i],p[++cnt]=i;
reverse(p+1,p+1+cnt);
f[1][0]=1;f[1][1]=(p[1]-1)/2;
for (int i=2;i<=cnt;++i) {
f[i][0]=f[i-1][1]+f[i-1][0];
f[i][1]=(p[i]-p[i-1]-1)/2*f[i-1][0]+(p[i]-p[i-1])/2*f[i-1][1];
}
cout<<f[cnt][1]+f[cnt][0];
return 0;
}
洛谷 [BJOI2012]最多的方案的更多相关文章
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- [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,每一项都可以称为斐波那契数 ...
- BZOJ1079或洛谷2476 [SCOI2008]着色方案
一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...
- 【题解】洛谷P1065 [NOIP2006TG] 作业调度方案(模拟+阅读理解)
次元传送门:洛谷P1065 思路 简单讲一下用到的数组含义 work 第i个工件已经做了几道工序 num 第i个工序的安排顺序 finnish 第i个工件每道工序的结束时间 need 第i个工件第j道 ...
- 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)
题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的 ...
- [BJOI2012]最多的方案(记忆化搜索)
第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数.现在给一个正整数N,它可以写成一些斐波那契数的和的形式. ...
- 洛谷——P2756 飞行员配对方案问题
P2756 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其 ...
- 洛谷P2756 飞行员配对方案问题(二分图匹配)
P2756 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其 ...
随机推荐
- Verilog语言:还真的是人格分裂的语言
人气腹语术师天愿在现场披露了被人偶搭档夺取灵魂的腹语术师将妻子杀害的表演节目.天愿真的陷入了多重人格,命令自己杀害妻子和子的人偶的人格出现了.为了不(让自己)杀害和弟子登川有外遇的妻子,天愿提出委托想 ...
- java使用lambda表达式对List集合进行操作(JDK1.8)
1. 使用lambda表达式对List集合进行操作(JDK1.) List<TreeDto> collect = list.stream().filter(item -> item. ...
- Apache伪静态Rewrite详解
一.Rewrite规则简介:Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于 Perl语言.可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式.如果要 ...
- hMailServer之允许用户自己修改密码
使用hMailServer搭建邮件系统,使用webmail实现web收发邮件,但是又个问题是在webmail中用户自己无法修改密码. 可以使用hMailServer自带的PhpWebAdmin来实现让 ...
- 【Mac命令行学习】(持续更新)
常用命令: 一.修改环境变量文件: 1.进入文件:vi .bash_profile 2.键盘点击[a]键,进入文件编辑 3.修改完成后,如果是vi,点击[esc]键退出编辑模式 4.输入以下命令进行具 ...
- k8s入门
一个目标:容器操作:两地三中心:四层服务发现:五种Pod共享资源:六个CNI常用插件:七层负载均衡:八种隔离维度:九个网络模型原则:十类IP地址:百级产品线:千级物理机:万级容器:相如无亿,K8s有亿 ...
- phpcms利用广告位实现轮播图调用
如果我们使用自带的广告轮播,那么就是失去原有的轮播样式,这里就教大家一种使用广告轮播,还能保留原有的轮播样式 1.需要找到广告位的模块位置 3 下载广告代码 https://files.cnblogs ...
- 请谈谈对SOA的认识。
请谈谈对SOA的认识. 解答:面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接 ...
- 使用StringTokenizer分解字符串
Java切割字符串.一般使用substring.split.StringTokenizer来处理,前两种是String对象的方法,使用字符串能够直接处理,本文介绍下StringTokenizer的使用 ...
- [翻译]创建ASP.NET WebApi RESTful 服务(11)
本章介绍通过使用Ali Kheyrollahi开发的CacheCow来实现服务器端的缓存.所有代码现在都可以在GitHub上下载. 我们将要实现的缓存方式叫做Conditional Requests, ...