cdoj 斐波那契进制
//昨天在姜神的提醒下发现这种方法可以解决升级版的 非升级版直接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 斐波那契进制的更多相关文章
- Atcoder rc122-c Calculator 斐波那契
传送门 题解 先说结论: 任意正整数可以拆分成若干个斐波那契数 斐波那契数列: 1 1 2 3 5 8 13 21 34 例 17 = 13 + 3 + 1 看上去是对的,怎么证明呢? 首先假如每一个 ...
- [BSGS算法]纯水斐波那契数列
学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- 【C++】【斐波那契】求第几个斐波那契数字。
首先在头文件 whichfibonaccinumber.h 中写了一个使用加法的解法.没有验证输入数字是否小于0. #ifndef WHICHFIBONACCINUMBER_H_ #define WH ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- hdu5686大数斐波那契
Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多 ...
- [luogu3938][斐波那契]
题目链接 思路 首先可以看出来每个月新增的兔子构成的斐波那契数列.然后每代兔子都可以用斐波那契数列中的一个数来表示.所以对于每只兔子都能在斐波那契数列中找到他所属的一个位置.因为每个兔子都是在两个月之 ...
- 【洛谷mNOIP模拟赛Day1】T1 斐波那契
题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...
- HDU 5914 Triangle 斐波纳契数列 && 二进制切金条
HDU5914 题目链接 题意:有n根长度从1到n的木棒,问最少拿走多少根,使得剩下的木棒无论怎样都不能构成三角形. 题解:斐波纳契数列,a+b=c恰好不能构成三角形,暴力就好,推一下也可以. #in ...
随机推荐
- jQuery 随滚动条滚动效果 (固定版)
//侧栏随动 var rollStart = $('.feed-mail'), //滚动到此区块的时候开始随动 rollSet = $('.search,.weibo,.group,.feed-mai ...
- Linux查看所有用户用什么命令1
用过Linux系统的人都知道,Linux系统查看用户不是会Windows那样,鼠标右键看我的电脑属性,然后看计算机用户和组即可. 那么Linux操作系统里查看所有用户该怎么办呢?用命令.其实用命令 ...
- java比较器 之compareable 和comparato比较
compareable 测试类import java.util.Set; import java.util.TreeSet; public class Test { public static voi ...
- Jquery remove()和empty()
要用到移除指定元素的时候,发现empty()与remove([expr])都可以用来实现.可仔细观察效果的话就可以发现.empty()是只移除了 指定元素中的所有子节点,拿$("p" ...
- fieldset 使用小案例
有初学者问到如何做出如下页面: 对应的代码如下: <fieldset> <legend>★审核状态</legend> <input name="st ...
- WampServer下如何实现多域名配置
原文:WampServer下如何实现多域名配置 之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心 ...
- gitlab 安装报错:Could not find modernizr-2.6.2 in any of the sources
2014-04-30 15:27:44 标签:gitlab 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://davidbj.b ...
- hdu 5115 Dire Wolf(区间dp)
Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful w ...
- localStorage点击次数存储
<!DOCTYPE html><html><head><meta charset="utf-8"> <title>菜鸟教 ...
- C#中IList<T>与List<T>的区别感想【转】
写代码时对: IList IList11 =new List (); List List11 =new List (); 有所疑惑,于是在网上搜索一下,很受启发,于是收藏下来,但对部分观点不敢苟同,用 ...