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

题目大意:

将\(n(n\le10^9)\)表示成若干个不同斐波那契数之和的形式,求方案数。

思路:

如果不考虑\(0\),则\(10^9\)以内的斐波那契数只有86个。

首先求出字典序最大的方案,考虑分裂里面的数。

用\(c_i\)表示字典序最大方案在斐波那契数列中的下标(递增),\(f_{i,j}\)表示考虑到第\(i\)个数,本身是否分裂的方案数。

转移方程为:

\[f_{i,0}=f_{i-1,0}+f_{i-1,1}\\
f_{i,1}=\lfloor\frac{c_i-c_{i-1}-1}2\rfloor f_{i-1,0}+\lfloor\frac{c_i-c_{i-1}}2\rfloor f_{i-1,1}
\]

单次询问时间复杂度\(\mathcal O(86)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long int64;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
int64 f[87][2],c[87],fib[87]={
0,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,1771\
1,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5\
702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296\
,433494437,701408733,1134903170,1836311903,2971215073ll,4807526976ll,7778742049l\
l,12586269025ll,20365011074ll,32951280099ll,53316291173ll,86267571272ll,13958386\
2445ll,225851433717ll,365435296162ll,591286729879ll,956722026041ll,1548008755920\
ll,2504730781961ll,4052739537881ll,6557470319842ll,10610209857723ll,171676801775\
65ll,27777890035288ll,44945570212853ll,72723460248141ll,117669030460994ll,190392\
490709135ll,308061521170129ll,498454011879264ll,806515533049393ll,13049695449286\
57ll,2111485077978050ll,3416454622906707ll,5527939700884757ll,8944394323791464ll\
,14472334024676221ll,23416728348467685ll,37889062373143906ll,61305790721611591ll\
,99194853094755497ll,160500643816367088ll,259695496911122585ll,42019614072748967\
3ll,679891637638612258ll
};
int main() {
for(register int T=getint();T;T--) {
int64 n=getint();
int cnt=0;
for(register int p=std::lower_bound(&fib[1],&fib[87],n)-fib;p;p--) {
if(n>=fib[p]) {
n-=fib[p];
c[++cnt]=p;
}
}
std::reverse(&c[1],&c[cnt]+1);
f[1][0]=1;
f[1][1]=(c[1]-1)/2;
for(register int i=2;i<=cnt;i++) {
f[i][0]=f[i-1][0]+f[i-1][1];
f[i][1]=f[i-1][0]*((c[i]-c[i-1]-1)/2)+f[i-1][1]*((c[i]-c[i-1])/2);
}
printf("%lld\n",f[cnt][0]+f[cnt][1]);
}
return 0;
}

[CF126D]Fibonacci Sums/[BJOI2012]最多的方案的更多相关文章

  1. BJOI2012 最多的方案

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

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

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

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

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

  4. BZOJ.2660.[BJOI2012]最多的方案(DP)

    题目链接 首先我们知道: 也很好理解.如果相邻两项出现在斐波那契表示法中,那它们显然可以合并. 所以我们能得到\(n\)的斐波那契表示,记\(pos[i]\)为\(n\)的斐波那契表示法中,第\(i\ ...

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

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

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

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

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

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

  8. bzoj2660最多的方案

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

  9. CF(D. Fibonacci Sums)dp计数

    题目链接:http://codeforces.com/contest/126/problem/D 题意:一个数能够有多种由互不同样的斐波那契数组成的情况: 解法:dp,easy证明:每一个数通过贪心能 ...

随机推荐

  1. 微信小程序rpx单位

    rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375p ...

  2. NYOJ 814 又见拦截导弹 (模拟)

    题目链接 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以 ...

  3. Django之组合搜索组件(一)

    什么是组合搜索呢? 比如你想买车,但手里只有10万块!所以你只能在10万块的车里挑选,但你喜欢黑色,因为觉得很高端大气上档次,说白了就是装逼杠杠的!之后售车姐给你拿了个表表,你看到了低于10万块且颜色 ...

  4. 数据类型的判断 --Object.prototype.toString.call(obj)精准检测对象类型

    数据类型的判断 typeof typeof返回一个表示数据类型的字符串,返回结果包括:number.boolean.string.symbol.object.undefined.function等7种 ...

  5. linux 进程优先级 之设置实时进程 (另一种方式是设置nice值)【转】

    转自:https://www.cnblogs.com/jkred369/p/6731353.html Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIF ...

  6. udhcpc命令

    要使用网络通讯,所以不可避免的要用到dhcp.理想的网络通讯方式是下面3种都要支持: 1,接入已有网络.这便要求可以作为dhcp客户端. 2,作为DHCP服务器,动态分配IP. 简单说下前2种情况. ...

  7. 百度地图js lite api 支持点聚合

    百度地图lite api 是专门为h5 绘制海量点设计的,但是偏偏忽略掉了点聚合的需求,所以需要自己动手,做一次二次改造. 我们知道点聚合需要引入开源库: MarkerClusterer:  http ...

  8. $FFT$(快速傅里叶变换)

    - 概念引入 - 点值表示 对于一个$n - 1$次多项式$A(x)$,可以通过确定$n$个点与值(即$x$和$y$)来表示这唯一的$A(x)$ - 复数 对于一元二次方程 $$x^2 + 1 = 0 ...

  9. Python Random模块生成伪随机数字

    This module implements pseudo-random number generators for various distributions. 对于整数,有一个范围的均匀选择: 对 ...

  10. Django项目上传到AWS服务器上

    EC2是亚马逊(Amazon.com)提供的弹性云计算服务:Apache是一个跨平台的Web服务器端软件,可以使Python.PHP.Perl等语言编写的程序运行在服务器上:Django是一个Web程 ...