题目描述
nowcoder利用业余时间养了一窝蜜蜂,因为空间比较小,蜂房只有两排,如下图所示:
如你所见,蜜蜂的蜂房是正六边形,假设蜜蜂只会从左往右爬,即从1号蜂房能爬到2号和3号;从6号蜂房能爬到7号和8号……
现给出两个蜂房的编号a和b,要求计算蜂房a的蜜蜂爬到蜂房b有几条不同路线。
输入描述:
- 输入的第一行是一个整数n
- 接下来n行数据,每行一组测试用例
- 每组测试用例包含两个正整数a和b,(0 < a < b < 2^31)
输出描述:
每组用例的结果单独输出一行。输出数据结果范围是 [0, 2^63)。
输入例子:
3
1 2
3 6
99 100
输出例子:
1
3
1
由于排列规则可知,以及只能往左、右走,可知只有n-2
、n - 1
到达n
。
那不就得出了f(n) = f(n - 1) + f(n - 2)
么,这不就是斐波拉契尔数列问题么。。。
路线数 | 始、终差 | |
---|---|---|
1->1 | 1 | 0 |
1->2 | 1 | 1 |
1->3 | 2 | 2 |
1->4 | 3 | 3 |
1->5 | 5 | 4 |
1->6 | 8 | 5 |
1、1、2、3、5、8
不就是一个斐波拉契尔数列么
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
//建立一张表,用于记录f(n)各项值,注意数据溢出,使用long long型
//由于斐波拉契尔数列第103项已经超过了2^63,并且题目说明结果不会超过2^63,因此计算1-102
long long fTable[103] = {1, 1};
for (int i = 2; i < 103; ++i) {
fTable[i] = fTable[i - 1] + fTable[i - 2];
}
int count = 0;
//scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
while (scanf("%d", &count) != - 1) {
for (int i = 0; i < count; ++i) {
int a = 0, b = 0;
scanf("%d %d", &a, &b);
printf("%lld\n", fTable[b - a]);
}
}
return 0;
}