//昨天在姜神的提醒下发现这种方法可以解决升级版的 非升级版直接01背包就好

//这题脑洞开得真是够大

解:大概要先把数分解成斐波拉契进制,x=f1*(0或1)+f2*(0或1)+...+fn*(0或1) f1表示第一个斐波拉契数字(和二进制分解很像 但是这里要分解成斐波拉契进制)

然后如果一个数分解后某三位位上为100 那么可以将其拆分为011(再拆01011 0101011)

于是有dp[i][0]代表某一位不拆 dp[i][1]代表某一位拆a[i]代表第i个1后面有多少0,于是

dp[i][0] += dp[i - 1][0] + dp[i - 1][1];
dp[i][1] += dp[i - 1][0] * (a[i] / 2) + dp[i - 1][1] * ((a[i] + 1) / 2);

//那个a[i]/2自己画出来看看就知道了 很显然的

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<string> using namespace std; long long T;
long long f[];
long long dp[][];
long long a[];
long long cnt; void get_a(long long x){
long long e[];
memset(e,,sizeof(e));
for (long long i=;i>=;i--){
if (x>=f[i]){
e[i]=;
x-=f[i];
}
}
long long tmp=;
cnt=;
memset(a,,sizeof(a));
for (long long i=;i<=;i++){
if (e[i]==){
a[++cnt]=tmp;
tmp=;
}
else{
tmp++;
}
}
} int main(){
f[]=;
f[]=;
for (long long i=;i<=;i++) f[i]=f[i-]+f[i-];
scanf("%lld",&T);
for (long long cas=;cas<T;cas++){
long long x;
scanf("%lld",&x);
get_a(x);
memset(dp,,sizeof(dp));
dp[][]=;
dp[][]=a[]/;
for (long long i=;i<=cnt;i++){
dp[i][]=dp[i-][]+dp[i-][];
dp[i][]=dp[i-][]*(a[i]/)+dp[i-][]*((a[i]+)/);
}
printf("%lld\n",dp[cnt][]+dp[cnt][]);
}
return ;
}
/*
6
1
2
3
4
5
13
*/

cdoj 斐波那契进制的更多相关文章

  1. Atcoder rc122-c Calculator 斐波那契

    传送门 题解 先说结论: 任意正整数可以拆分成若干个斐波那契数 斐波那契数列: 1 1 2 3 5 8 13 21 34 例 17 = 13 + 3 + 1 看上去是对的,怎么证明呢? 首先假如每一个 ...

  2. [BSGS算法]纯水斐波那契数列

    学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...

  3. 矩阵乘法快速幂 codevs 1574 广义斐波那契数列

    codevs 1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 广义的斐波那契数列是指形如 ...

  4. 【C++】【斐波那契】求第几个斐波那契数字。

    首先在头文件 whichfibonaccinumber.h 中写了一个使用加法的解法.没有验证输入数字是否小于0. #ifndef WHICHFIBONACCINUMBER_H_ #define WH ...

  5. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  6. hdu5686大数斐波那契

    Problem Description   度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多 ...

  7. [luogu3938][斐波那契]

    题目链接 思路 首先可以看出来每个月新增的兔子构成的斐波那契数列.然后每代兔子都可以用斐波那契数列中的一个数来表示.所以对于每只兔子都能在斐波那契数列中找到他所属的一个位置.因为每个兔子都是在两个月之 ...

  8. 【洛谷mNOIP模拟赛Day1】T1 斐波那契

    题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...

  9. HDU 5914 Triangle 斐波纳契数列 && 二进制切金条

    HDU5914 题目链接 题意:有n根长度从1到n的木棒,问最少拿走多少根,使得剩下的木棒无论怎样都不能构成三角形. 题解:斐波纳契数列,a+b=c恰好不能构成三角形,暴力就好,推一下也可以. #in ...

随机推荐

  1. Android 自定义下拉刷新ListView

    package com.dwtedx.qq.view; import android.content.Context; import android.util.AttributeSet; import ...

  2. getHibernateTemplate().find()

    find(String queryString, Object[] values); 这个方法后者的参数必须是一个数组,而不能是一个List. List ul=getHibernateTemplate ...

  3. jQuery 中使用 JSON

    转载:http://www.cnblogs.com/haogj/archive/2011/12/01/2271098.html JSON 格式 json 是 Ajax 中使用频率最高的数据格式,在浏览 ...

  4. 用Express搭建 blog (一)

    Info 公司马上要举行 hack day 了,这次决定和小伙伴用 Express 作为框架来搭建我们的应用,所以昨天搭出来UI后,今天开始系统的学习下 Express. Start 首先是expre ...

  5. 短路与&&和按位与&的区别

    条件1&&条件2,短路与&&如果条件1为假则不判断条件2:而按位与&如果条件1为假仍旧判断条件2

  6. C/C++各种系统开发环境搭建

    http://pan.baidu.com/s/1qWJKF4g

  7. 剑指offer32 整数中1出现的次数(从1到n整数中1出现的次数)

    class Solution { public: int NumberOf1Between1AndN_Solution(int n) { ) ; ; ; while(i<=n) { int p= ...

  8. 拾遗补缺之session,高手请跳过!

    session timeout(单位:分钟)---web.config文件中 session共享时需要使用stateServer模式(web.config中,mode="stateServe ...

  9. 改良版的SQL Service 通用存储过程分页

    上次写了通用存储过程.感觉还是有很大的BUG.就是条件不能参数画化.这个BUG可以说是致命的.但是我一直想在用什么方法能解决这个东西.其实我只是想写少量的代码来做更多的事情.我想能不能传集合给存储过程 ...

  10. java:添加一条数据到数据库中文乱码

    在数据库链接地址后面加上:characterEncoding=UTF8 如:jdbc\:mysql\://localhost\:3306/db_sjzdaj?relaxAutoCommit=true& ...