洛谷

这题是旁边同学介绍的,听他说记忆化搜索可以过。。。

不过我还是老老实实的想\(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][0]+f[i-1][1]
\]

\[f[i][1]=(p[i]-p[i-1]-1)/2*f[i-1][0]+(p[i]-p[i-1])/2*f[i-1][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]最多的方案的更多相关文章

  1. 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码

    洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...

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

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

  3. BJOI2012 最多的方案

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

  4. BZOJ1079或洛谷2476 [SCOI2008]着色方案

    一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...

  5. 【题解】洛谷P1065 [NOIP2006TG] 作业调度方案(模拟+阅读理解)

    次元传送门:洛谷P1065 思路 简单讲一下用到的数组含义 work 第i个工件已经做了几道工序 num 第i个工序的安排顺序 finnish 第i个工件每道工序的结束时间 need 第i个工件第j道 ...

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

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

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

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

  8. 洛谷——P2756 飞行员配对方案问题

    P2756 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其 ...

  9. 洛谷P2756 飞行员配对方案问题(二分图匹配)

    P2756 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其 ...

随机推荐

  1. Android ART介绍

    1.ART之所以会比Dalvik快,是由于ART运行的是本地机器指令,而Dalvik运行的是Dex字节码.通过通过解释器运行. 虽然Dalvik也会对频繁运行的代码进行JIT生成本地机器指令来运行,但 ...

  2. php新版本废弃 preg_replace /e 修饰符

    php新版本废弃 preg_replace /e 修饰符 分类: PHP -- : 3531人阅读 评论() 收藏 举报 php正则 最近服务器php版本升级到了 5.6 发现出了很多警告 [php] ...

  3. sscanf及sprintf

    在程序中,我们肯定会遇到许多处理字符串的操作,当然C++中的string类已经做了很好了,但是也不要忘了C中的sscanf和sprintf 这两个函数用法跟printf和scanf用法很相似,只不过数 ...

  4. Oracle连接远程数据库的四种设置方法

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍 第一种方法: 若oracle服务器装在本机上,那就不多说了,连 ...

  5. Fly (From Wikipedia)

    True flies are insects of the order Diptera, the name being derived from the Greek δι- di- "two ...

  6. sublime3 SublimeREPL python3

    https://blog.csdn.net/lylfv/article/details/81453016

  7. 海康网络摄像机调用SDK解码Java版

    两个回调函数: FRealDataCallBack 实现预览回调数据 DecCallBack 解码回调函数 在HCNetSDK.java补充相关函数和结构声明 //播放库函数声明,PlayCtrl.d ...

  8. 虚拟机Ubuntu系统下kaldi安装与编译简介

    kaldi官网:http://www.kaldi-asr.org/doc/index.html 在http://github.com/kaldi-asr/kaldi中直接下载kaldi的zip包,没有 ...

  9. 解决使用VS2013创建的MVC项目在VS2015中打开的各种问题

    其实很多问题一直都存在,但是因为其不影响编译结果和运行结果,所以我也就一直没理它.但是问题放在那一直存在,偶尔想起来还有某些问题没解决的时候心里总是感觉不得劲,所以今天就彻底的查查资料解决了. 问题一 ...

  10. backbone Model调用save方法的时候提交方式

    horizon使用的是backbone框架,但是我们的后台api都是只接收post请求,请求的路径为/api/,根据backbone的官档解释: backbone的model.save方法会判断当前的 ...