Atcoder rc122-c Calculator 斐波那契

传送门
题解
先说结论: 任意正整数可以拆分成若干个斐波那契数
斐波那契数列: 1 1 2 3 5 8 13 21 34
例 17 = 13 + 3 + 1
看上去是对的,怎么证明呢?
首先假如每一个斐波那契数可以重复多次,那么显然成立(因为可以重复使用\(1\)来构成)
进一步 因为\(f_{x} = f_{x-1} + f_{x-2}\), \(f_{x-1} > f_{x-2}\) 所以 \(f_{x} < 2f_{x-1}\)
假设我们使用了两次\(f_{x-1}\), 那么我们可以使用一次类似进位的操作把他进成\(f_{x}\)(剩下的递归构造)
这样一旦有重复的我们就进位,最后可以得到一个不重复的子数列
也就是说 任意正整数可以拆分成若干个斐波那契数的和
(我把这玩意称作斐波那契进制数?
好了,回到我们这道题目上来, 不难发现反复进行3,4操作实际上就是在计算斐波那契数列
那么问题来了我们可以通过这个方式来得到一个斐波那契数,但是怎么才能得到若干个斐波那契数的和呢
来看看,我们让第三个斐波那契数加1(其实就是在计算过程中使用1, 2操作
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
| 1 | 1 | 3 | 4 | 7 | 11 | 18 | 29 | 47 | 76 |
| +0 | +0 | +1 | +2 | +3 | +5 | +8 | +13 | +21 | +34 |
容易发现我们在第三项加一,后面增加的数又构成了斐波那契数列。
对, 就是你想的那样, 我们想要让x最终变成76 (55 + 34)的话, 就直接在第三项计算完之后调用操作1/2,让他加一,这样在计算到55时,就会加34, 也就是 55 + 34 = 76;
好了,剩下的就只有推式子和实现了。
void pre(){
f[0]=0, f[1]=1;
for(int i=2; i<=100; i++) f[i] = f[i-1] + f[i-2];
}
int main(){
a=read();
pre();
n=100;
while(f[n] > a) n--;
for(int i=n; i>0; i--){
if(a>=f[i]){
v[n-i+1] = 1;
a -= f[i];
}
}
int ans = 0;
cout << 130 << endl;
int it = (n%2);
for(int i=1; i<=n; i++){
if(i != 1){
ans++;
cout << it?3:4 << endl;
}
if(v[i]){
ans++;
cout << it?1:2 << endl;
}
it = !it;
}
for(int i=ans; i<130; i++) cout << 4 << endl;
return 0;
}
Atcoder rc122-c Calculator 斐波那契的更多相关文章
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- python迭代器实现斐波拉契求值
斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为"兔子数列":F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).例 ...
- Ural 1225. Flags 斐波那契DP
1225. Flags Time limit: 1.0 secondMemory limit: 64 MB On the Day of the Flag of Russia a shop-owner ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 算法: 斐波那契数列C/C++实现
斐波那契数列: 1,1,2,3,5,8,13,21,34,.... //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- Python递归及斐波那契数列
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...
随机推荐
- POJ1698 最大流或者匈牙利
题意: 一个人他有n个任务,每个任务都有一些限制: (1)只能在一个星期中指定的日子去做,比如周1 2 6啥的 (2)总工作量有几天,就是一共要工作几天 (3)必须在几周之内完成,就 ...
- seccomp沙盒逃逸基础——沙盒的规则编写
seccomp沙盒逃逸基础--沙盒的规则编写 引入: 安全计算模式 seccomp(Secure Computing Mode)是自 Linux 2.6.10 之后引入到 kernel 的特性.一切都 ...
- repo sync error: .repo/manifests/: contains uncommitted changes
andorid 源码库同步,报错如标题,好几次想放弃,尝试了网上不少办法,无效, 最终从 stackoverflow 得到答案: After issued repo sync, I got a err ...
- Dom树,什么是dom树?
相信很多初学前端的小伙伴,学了html,css,js之后,欣喜之余还有一丝小傲娇,没有想到那些大佬们口中又 提到了DOM树.你两眼一抹黑,年轻人总是要接受社会的爱(du)护(da). DOM 是 Do ...
- 优雅地使用命令行:Tmux 终端复用
转自:http://harttle.com/2015/11/06/tmux-startup.html 你是否曾经开过一大堆的Terminal?有没有把它们都保存下来的冲动?Tmux 的Session就 ...
- 【技术博客】基于vue的前端快速开发(工具篇)
一.Vue教程 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组 ...
- Java集合详解(二):ArrayList原理解析
概述 本文是基于jdk8_271版本进行分析的. ArrayList是Java集合中出场率最多的一个类.底层是基于数组实现,根据元素的增加而动态扩容,可以理解为它是加强版的数组.ArrayList允许 ...
- 【zombie】如何查看并杀死僵尸进程?
[zombie]如何查看并杀死僵尸进程? 赏金Micheal关注 2019.03.31 19:40:15字数 1,016阅读 4,373 僵尸进程定义 In UNIX System terminolo ...
- vmware快捷键大全
初学linux的朋友往往需要使用VMware这个软件 与其打交道多了 越来越觉得快捷键的重要性 特将搜集到的快捷键记录以便查阅记忆 Ctrl-Alt-Enter 进入全屏模式 ctrl+alt+ins ...
- 强哥CSS学习笔记
html嵌套css样式:1.外部(推荐)2.内部3.内联(不推荐) css优先级1.内联2.id选择器3.class选择器4.标签 css长度单位:1.px2.em (14px) css选择器:常用选 ...