传送门


题解


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

斐波那契数列: 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. Log4j讲解

    讲解 通常,我们写代码的过程中,免不了要输出各种调试信息.在没有使用任何日志工具之前,都会使用 System.out.println 来做到. 这么做直观有效,但是有一系列的缺点:1. 不知道这句话是 ...

  2. 【微信小程序】--bindtap参数传递,配合wx.previewImage实现多张缩略图预览

    本文为原创随笔,纯属个人理解.如有错误,欢迎指出. 如需转载请注明出处 在微信小程序中预览图片分为 a.预览本地相册中的图片. b.预览某个wxml中的多张图片. 分析:实质其实是一样的.都是给wx. ...

  3. 使用FileStream读写数据

    这节讲一下使用FileStream读写数据,这是一个比较基础的流. FileStream类只能处理原始字节,所以它可以处理任何类型的文件. 先看一下它的构造方法: FileStream fs = ne ...

  4. [Qt] 事件机制(二)

    在samp4_1中加一个小功能,点击右上角关闭按钮时,弹出"确认是否关闭"的消息框.如果点"yes"则关闭,如果点"No"则不关闭 在wid ...

  5. SimpleSelectionSort

    简单选择排序 <script type="text/javascript"> var obj={ data:[0,3,1,5,7,4,8,9,5], length:8 ...

  6. 中间件系列一 RabbitMQ之安装和Hello World Demo

    https://blog.csdn.net/hry2015/article/details/79016854 1. 概述 RabbitMQ是一个由erlang开发的AMQP(Advanced Mess ...

  7. [转载]libvirt(virsh命令总结)

    libvirt(virsh命令总结) virsh回车进入交互式界面: version pwd hostname 显示本节点主机名 nodeinfo  显示节点信息 list --all 显示所有云主机 ...

  8. 《我常用的股票投资工具与网站》v2.0

    <我常用的股票投资工具与网站>v2.0 王大海 职业投资,抽空做一点分享. 661 人赞同了该文章 "少年你好,想不到你竟有如此因缘际会看到这里.我看你骨骼精奇,定是万中无一的交 ...

  9. openstack创建vlan网络并配置网络设备

    1.在管理员-->网络-->创建网络. 2.填写网络信息,这里要划分新的VLAN,注意在物理网络中填写的事VLAN,段ID指的是vlan的id 3.创建的网络. 4.创建子网,在里面修改子 ...

  10. 大文件查找 du -ahx . | sort -rh | head -10

    # cd /root@test-W330-C30:/# du -ahx . | sort -rh | head -58.2G .5.6G ./usr3.3G ./usr/share1.9G ./usr ...