题目描述
我们按以下方式产生序列:
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>

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

被折叠的 条评论
为什么被折叠?



