传送门


题解


先说结论: 任意正整数可以拆分成若干个斐波那契数

斐波那契数列: 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 斐波那契的更多相关文章

  1. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. python迭代器实现斐波拉契求值

    斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为"兔子数列":F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).例 ...

  3. 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 ...

  4. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  5. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  6. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  7. 算法: 斐波那契数列C/C++实现

    斐波那契数列: 1,1,2,3,5,8,13,21,34,....     //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ...

  8. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  9. Python递归及斐波那契数列

    递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...

随机推荐

  1. POJ1325二分匹配或者DINIC(最小路径覆盖)

    题意:        有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...

  2. java线程池实践

    线程池大家都很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任务)队列, ...

  3. Java中读取文件的几种路径配置

    获取配置文件的两种方式区别 ClassLoader.getSystemClassLoader().getResourceAsStream() //ClassLoader.getSystemClassL ...

  4. 虚拟机之 Parallels Desktop

    去官网看看 在 Mac 虚拟机中跨多个操作系统开发和测试 访问 Microsoft Office for Windows 和 Internet Explorer 快速运行 Windows 应用不会减慢 ...

  5. python通过字符串定义函数名

    记录python里的一个有意思的小技巧:通过字符串定义函数名称. import sys m=sys.modules[__name__] def temp(x): return x+1 setattr( ...

  6. Java解析xml文件遇到特殊符号&会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  7. VS2010编写32位和64位dll环境配置,以及判断dll是多少位

    前言 最近在编写dll注入程序的时候,因为想注入到系统进程,结果发现总是注入失败.自闭了好长一会发现我忘记了我的系统是64位的,系统进程也是64位的,而我编写的待注入的DLL是32位了,所以才导致失败 ...

  8. 1小时快速搭建基于Azure Custom Vision和树莓派的鸟类分类和识别应用

    1. 引言 最近在微软Learn平台学习Azure认知服务相关的内容,看到了一个有关"使用自定义视觉对濒危鸟类进行分类"的专题,该专题的主要内容就是使用 Azure Custom ...

  9. [Python] tkinter 之 Listbox & Combobox

    示例: 1 #用户界面 2 import os 3 os.chdir('F:\\spyder_workspace\\ColCal') 4 import Main 5 from tkinter impo ...

  10. [Python] execl读写

    相关库 读:xlrd 写:xlwt 案例 要求: 将图1中的数据导以图2的形式写入另一个文件中 第一列索引关系:{1:K1-B1,2:K1-B2} ...(18列) 思路: 按行读取数据,根据索引关系 ...