题解:洛谷 P2437 蜜蜂路线

【题目来源】

洛谷:P2437 蜜蜂路线 - 洛谷 (luogu.com.cn)

【题目描述】

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

image

【输入】

输入 \(m,n\) 的值

【输出】

爬行有多少种路线

【输入样例】

1 14

【输出样例】

377

【解题思路】

image

【算法标签】

《洛谷 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
posted @ 2026-02-17 16:23  团爸讲算法  阅读(7)  评论(0)    收藏  举报