[数学]无限序列

该博客探讨了一个无限序列的变化规律,其中每个1变为10,每个0变为1。通过斐波那契数列的性质,作者分析了如何计算序列中特定区间的1的数量,并提出了解答此类问题的算法思路,即利用斐波那契数列求解区间内1的个数,并处理非斐波那契数的情况。

题目描述
我们按以下方式产生序列:
1、 开始时序列是: “1” ;
2、 每一次变化把序列中的 “1” 变成 “10” ,”0” 变成 “1”。
经过无限次变化,我们得到序列”1011010110110101101…”。
总共有 Q 个询问,每次询问为:在区间A和B之间有多少个1。
任务:写一个程序回答Q个询问
Input
第一行为一个整数Q,后面有Q行,每行两个数用空格隔开的整数a, b。
Output
共Q行,每行一个回答
Sample Input
1
2 8
Sample Output
4

1 <= Q <= 5000
1 <= a <= b < 2^63

分析
我推算了一小会儿两个钟头
发现一个规律,完整的一个序列,它的长度是上一个序列+上上个序列的长度。
是不是似曾相识?没错,就是斐波那契数列
然后我又观察了一会儿,发现当前序列的长度是上一个序列的长度+上一个序列中含1的个数
这就说明了,一个完整的序列中含1的个数必为它的上一项斐波那契数
但是如果序列长不是斐波那契数怎么办?
根据一个不证自明的定理(瞎推的)得知,任何一个正整数都可以被分解成多个斐波那契数
那么我们打个递归函数,把这个正整数的斐波那契部分求出,然后分解剩下不是斐波那契的部分即可
同时打个心眼:区间a,b,a那一位是算进去的,所以不能fib(b)-fib(a),而是fib(b)-fib(a-1)

#include <iostream>
#include <cstdio>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值