题解:洛谷 P2437 蜜蜂路线
【题目来源】
洛谷:P2437 蜜蜂路线 - 洛谷 (luogu.com.cn)
【题目描述】
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 \(m\) 开始爬到蜂房 \(n\),\(m\lt n\),有多少种爬行路线?(备注:题面有误,右上角应为 \(n-1\))

【输入】
输入 \(m,n\) 的值
【输出】
爬行有多少种路线
【输入样例】
1 14
【输出样例】
377
【解题思路】

【算法标签】
《洛谷 P2437 蜜蜂路线》 #高精度# #递推# #斐波那契,Fibonacci#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[5005] = {1}; // 初始化第一个数为1(斐波那契数列F(1))
int b[5005] = {1}; // 初始化第二个数为1(斐波那契数列F(2))
int c[5005] = {1}; // 用于存储当前计算结果
int len = 1; // 当前数字的位数
// 大数加法函数,计算斐波那契数列的下一项
void f()
{
int jw = 0; // 进位标志
// 逐位相加
for (int i = 0; i < len; i++)
{
c[i] = a[i] + b[i] + jw; // 当前位的和
jw = c[i] / 10; // 计算进位
c[i] %= 10; // 保留个位数
}
// 处理最高位的进位
if (jw != 0)
{
c[len] = jw;
len++; // 数字长度增加
}
// 更新a和b的值,为下一次计算做准备
for (int i = 0; i < len; i++)
{
a[i] = b[i]; // a = b (前一个数)
b[i] = c[i]; // b = c (当前计算出的数)
}
}
int main()
{
cin >> m >> n;
// 特殊情况处理
if (n - m + 1 == 1)
{
cout << 1;
return 0;
}
if (n - m + 1 == 2)
{
cout << 1;
return 0;
}
// 计算从第3项到第(n-m+1)项的斐波那契数
for (int i = 3; i <= n - m + 1; i++)
f();
// 逆序输出结果(因为数组是低位在前存储的)
for (int i = len - 1; i >= 0; i--)
cout << c[i];
return 0;
}
【运行结果】
1 14
377
浙公网安备 33010602011771号