题目大意

\(t\le 10^5\)组询问

每次询问\(1\le n\le 10^{18}\)

求有多少种\(n\)的\(fibonacci\)分解

分解定义为:每个\(fib\)数最多选一个,且和为\(n\)

分解出来的数是无序的

分析

妙不可言

可以先将\(n\)分解无相邻\(1\)的\(fib\)码

对于每个\(1\),可以拆分成\(1\),\(011\),\(01011\),\(0101011\),\(\cdots\)(最高位对齐)

然后再通过\(dp\)求解答案

单词复杂度为\(O(\log)\)

做法

先生成前\(90\)个\(fib\)

对于每个\(n\),将\(fib\)从大到小枚举,求出\(n\)的无相邻\(1\)的\(fib\) 码

那么求出每个\(1\)有多少种可能的拆法,就可以通过乘法原理求出答案

可能的拆法数依赖于相邻两个\(1\)之间的间隔

从右往左dp

dp[i][1]表示这一位不分解的方案数

dp[i][0]表示这一位分解了(留出一个0的空位) 的方案数

那么就有

\(dp[i][1]=dp[i+1][0]+dp[i+1][1]\)

\(dp[i][0]=dp[i+1][0]*\lfloor(ps[i]-ps[i+1])/2\rfloor+dp[i+1][1]*\lfloor(ps[i]-ps[i+1]-1)/2\rfloor\)

solution

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cctype>
  5. #include <cmath>
  6. #include <algorithm>
  7. using namespace std;
  8. typedef long long LL;
  9. inline int ri(){
  10. int x=0;bool f=1;char c=getchar();
  11. for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
  12. for(;isdigit(c);c=getchar()) x=x*10+c-48;
  13. return f?x:-x;
  14. }
  15. inline LL rl(){
  16. LL x=0;bool f=1;char c=getchar();
  17. for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
  18. for(;isdigit(c);c=getchar()) x=x*10+c-48;
  19. return f?x:-x;
  20. }
  21. int m;
  22. LL n;
  23. LL fib[93];
  24. int ps[93],tt;
  25. int dp[93][2];
  26. LL getans(LL n){
  27. int i;
  28. for(tt=0,i=90;i>0;--i) if(n>=fib[i]){
  29. n-=fib[i];
  30. ps[++tt]=i;
  31. }
  32. ps[++tt]=0;
  33. dp[tt][1]=1; dp[tt][0]=0;
  34. for(i=tt-1;i>0;--i){
  35. dp[i][0]= dp[i+1][1]*((ps[i]-ps[i+1]-1)/2) + dp[i+1][0]*((ps[i]-ps[i+1])/2);
  36. dp[i][1]= dp[i+1][0] + dp[i+1][1];
  37. }
  38. return dp[1][0]+dp[1][1];
  39. }
  40. int main(){
  41. int i;
  42. for(fib[0]=fib[1]=1,i=2;i<=90;i++) fib[i]=fib[i-1]+fib[i-2];
  43. m=ri();
  44. while(m--){
  45. n=rl();
  46. printf("%I64d\n",getans(n));
  47. }
  48. return 0;
  49. }

cf 126D - Fibonacci Decomposition的更多相关文章

  1. Codeforces 126D Fibonacci Sums 求n由随意的Sum(fib)的方法数 dp

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/34120269 题目链接:点击打开链接 题意 ...

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

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

  3. CF 981C Useful Decomposition

    题面 题目大意 给定一棵树,要求划分出几条链,使这几条链交于一点. 解题思路 因为所有链都要交于一点,所以必须交于一个度数最多的点.这样就形成了一个菊花形.然后从这个点出发到它的子树,判断子树的度数是 ...

  4. CF#213DIV2:B The Fibonacci Segment

    You have array a1, a2, ..., an. Segment [l, r] (1 ≤ l ≤ r ≤ n) is good if ai = ai - 1 + ai - 2, for ...

  5. CF 914 G Sum the Fibonacci —— 子集卷积,FWT

    题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...

  6. cf B. The Fibonacci Segment

    http://codeforces.com/contest/365/problem/B #include <cstdio> #include <cstring> #includ ...

  7. CF 914G Sum the Fibonacci——子集卷积

    题目:http://codeforces.com/contest/914/problem/G 第一个括号可以子集卷积:第三个括号可以用 FWT 异或卷积:这样算出选两个数组成 x 的方案数:三个部分的 ...

  8. 【CF 718C】fibonacci

    题意 给你一个长度为 \(n\) 的序列 \(a\),有 \(m\) 次操作,操作分两种 \(\text{1}\space \text{l}\space \text{r}\space \text{x} ...

  9. Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)

    第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...

随机推荐

  1. Jquery的简单API

    dsfsdjgsdjgsdjkg <script>console.log('erftwet')</script>

  2. dom节点获取文本的方式

    1. innerHTML innerHTML可以作为获取文本的方法也可以作为修改文本内容的方法 element.innerHTML 会直接返回element节点下所有的HTML化的文本内容 <b ...

  3. 爬虫学习(四)——post请求爬取

    百度翻译爬取数据 import urllib.requestimport urllib.parsepost_url = "https://fanyi.baidu.com/sug"h ...

  4. 基于flash-marker.js 的地图标注闪烁代码调试

    修改网上流传的flash-marker.js (function (global, factory) { typeof exports === 'object' && typeof m ...

  5. Windows CMD命令 查看无线密码

    netsh wlan show profiles netsh wlan show profiles name='无线网络名称' key=clear

  6. C盘扩容 更改C盘大小

    最近对xamarin有点兴趣,虽然网上的评论嘘声一片, 对于只想试一试的心态来说,对于网上所说的什么开发后的程序卡顿,可以用的三方库很少等, 我只想说,你们说的我不信,我要试一试看 我本来已经安装了v ...

  7. 03.VUE学习之动态绑定值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. pandas知识点(基本功能)

    1.重新索引 如果reindex会根据新索引重新排序,不存在的则引入缺省: In [3]: obj = Series([4.5,7.2,-5.3,3.6], index=["d", ...

  9. django开发基础

    一.配置静态文件 https://www.cnblogs.com/lshedward/p/10351051.html 二.路由分发 https://www.cnblogs.com/lshedward/ ...

  10. Linux文件类型 扩展名的作用

    链接类型文件 查找显示管道文件 普通文件类型 file 查看文件的类型 data文件类型 创建块字和符设备 mknod 1,.tar .tar.gz .tgz .zip tar.bz 表示压缩文件,创 ...