首页 > 其他分享 >P2437 蜜蜂路线

P2437 蜜蜂路线

时间:2024-04-13 16:00:56浏览次数:18  
标签:int rbrack lbrack len 路线 蜜蜂 那契 蜂房 P2437

P2437 蜜蜂路线

题目描述

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

输入格式

输入 \(m,n\) 的值

输出格式

爬行有多少种路线

样例

输入

1 14

输出

377

提示

对于100%的数据,\(1 \le M,N\le 1000\)


思路一

由题目可知,蜜蜂要想走到 \(i\) 号蜂房,那么它可以从 \(i-1\) 号蜂房走一步或从 \(i-2\) 号蜂房走两步,用 \(f \lbrack i \rbrack\) 表示走到 \(i\) 号蜂房的方案数,则 \(f \lbrack i \rbrack=f \lbrack i-1 \rbrack+f \lbrack i-2 \rbrack\)。易看出:方案数为斐波那契数列。当 \(i\) 大于 \(90\),\(f \lbrack i \rbrack\) 的值就超出了长整型范围,题目中 \(i\) 可取到的最大值为 \(1000\),因此需要使用高精度算法。

一开始蜜蜂在 \(m\) 号蜂房,走到 \(m\) 号蜂房的方案数为 \(1\),走到 \(m+1\) 号蜂房的方案数也为 \(1\),可以设为斐波那契数列的初始值。枚举 \(m+2\) 到 \(n\) 的斐波那契数列。接下来的代码,先用数组形式的高精度加法运算,数组 \(a,b,c\) 分别用来迭代斐波那契数列的每一项。需要注意以下几点:

  1. 迭代过程需要每次清空数组 \(c\);
  2. 答案可能为 \(0\),因此需要特判;
  3. 答案有可能输出第 \(m\) 项和第 \(m+1\) 项,可以特判。

代码

#include <bits/stdc++.h>

using namespace std;

int m, n, a[1010], b[1010], c[1010], lena, lenb, lenc;

void add()
{
	lenc = max(lena, lenb);
	for (int i = 1; i <= lenc; i ++ )
	{
		c[i] += a[i] + b[i];
		c[i + 1] = c[i] / 10;
		c[i] %= 10;
	}
	if (c[lenc + 1])
		lenc ++;
}

int main()
{
	scanf("%d %d", &m, &n);
	a[1] = 1;
	lena = 1;
	b[1] = 1;
	lenb = 1;
	if (n == 0) // 特殊数据
	{
		puts("0");
		return 0;
	}
	if (n == m)
	{
		puts("1");
		return 0;
	}
	if (n == m + 1)
	{
		puts("1");
		return 0;
	}
	for (int i = m + 2; i <= n - 1; i ++ )
	{
		add();
		memcpy(a, b, sizeof(b));
		lena = lenb;
		memcpy(b, c, sizeof(c));
		lenb = lenc;
		memset(c, 0, sizeof(c));
	}
	add();
	for (int i = lenc; i >= 1; i -- )
		printf("%d", c[i]);
	return 0;
}

思路二

结构体和重载运算符的方式。结构体变量为数组 \(f\),其属性包含斐波那契数列每一项数字的长度,及该数字各个位的数值。重载加号,递推方式:“\(f \lbrack i \rbrack=f \lbrack i-1 \rbrack+f \lbrack i-2 \rbrack\)”,记录斐波那契的每一项,最后输出 \(f \lbrack n \rbrack\) 的值。由于每一项都保留下来了,因此可以不必特判第 \(m\) 项和第 \(m+1\) 项。

代码

#include <bits/stdc++.h>

using namespace std;

int m, n;

struct node
{
	int len, s[5010];
	node()
	{
		len = 0;
		memset(s, 0, sizeof(s));
	}
} f[1010];

node operator + (node &a, node &b)
{
	node c;
	c.len = max(a.len, b.len);
	for (int i = 1; i <= c.len; i ++ )
	{
		c.s[i] += a.s[i] + b.s[i];
		c.s[i + 1] = c.s[i] / 10;
		c.s[i] %= 10;
	}
	if (c.s[c.len + 1])
		c.len ++;
	return c;
}

void print(node a)
{
	for (int i = a.len; i >= 1; i -- )
		printf("%d", a.s[i]);
}

int main()
{
	scanf("%d %d", &m, &n);
	if (n == 0)// 特殊数据
	{
		puts("0");
		return 0;
	}
	f[m].s[1] = 1;
	f[m].len = 1;
	f[m + 1].s[1] = 1;
	f[m + 1].len = 1;
	for (int i = m + 2; i <= n; i ++ )
		f[i] = f[i - 1] + f[i - 2];
	print(f[n]);
	return 0;
}

标签:int,rbrack,lbrack,len,路线,蜜蜂,那契,蜂房,P2437
From: https://www.cnblogs.com/IronMan-PZX/p/18132981

相关文章

  • P4568 [JLOI2011] 飞行路线
    分层图的板子题代码#include<bits/stdc++.h>#defineR(x)x=read()#definefifirst#definesesecondusingnamespacestd;typedefpair<int,int>PII;constintN=1e4,M=5e5;inlineintread(){intx=0,f=1;charch=getchar();......
  • 2024最新网络安全学习路线+自学笔记(超详细)
    01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有W......
  • Java的学习路线(非常完整)
    Java是一种跨平台的、面向对象的高级编程语言,主要用来进行网站后台开发,也就是服务器端开发,或者动态网站开发。Java是全球最受欢迎的编程语言之一,在世界编程语言排行榜TIOBE中,Java一直霸占着前三名,有好多年甚至都是第一名。JetBrains每年都会发布一个开发者生态系统调查报......
  • NLP学习路线指南总结
    当然可以,以下是一份较为详细的NLP学习路线指南,帮助你逐步掌握自然语言处理的核心技术和应用。一、基础知识与技能语言学基础:语言学基本概念:语音、语法、语义等。语言的层次与分类:语音学、音系学、句法学、语义学等。编程基础:掌握Python编程语言基础,包括变量、数据类......
  • 别再抱怨学鸿蒙没方向了! 这鸿蒙全栈(南北双向)开发学习路线收藏好!
    在互联网技术不断发展的现在,鸿蒙操作系统的出现标志着是能技术领域的一次重大突破,鸿蒙作为华为推出的一代操作系统,鸿蒙不仅达代表了自主创新的力量,还因为独特的分布式架构和全场景适配能力而备受关注。随着鸿蒙生态的不断完善、壮大,学习鸿蒙开发技术不仅对IT专业人士来说是......
  • MySQL学习路线一条龙
    引言在当前的IT行业,无论是校园招聘还是社会招聘,MySQL的重要性不言而喻。面试过程中,MySQL相关的问题经常出现,这不仅因为它是最流行的关系型数据库之一,而且在日常的软件开发中,MySQL的应用广泛,尤其是对于Java后端开发者来说,熟练掌握MySQL已成为他们技术能力评估的重要指标。因此,My......
  • 抢先看!界面控件DevExpress WPF 2024产品路线图预览(二)
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。本文将介绍2024年DevExpressWPF第一个主要更新(v2......
  • Go+云原生高级开发工程师进阶路线及资料推荐
    云原生这几年非常火,很多同学都在学习云原生相关技术,我也在如何进阶为Go+云原生高级开发工程师?中,详细介绍了如何学习,以使自己快速进阶为Go+云原生高级开发。这里我再快速总结下学习路线,并提供路线中涉及到的学习资料供你下载。学习路线本着只看优秀课程、不重复学习、学习......
  • golang学习路线
    golang学习路线学习Golang的路线可以分为以下几个阶段:基础语法:了解Golang的基本语法结构,包括变量声明、控制流、函数、指针等。数据类型:熟悉Golang的基本数据类型,如整型、浮点型、字符串、数组、切片、Map等。并发编程:学习Golang的并发编程特性,包括goroutines、channels和互斥......
  • 零基础自学网络安全的三个必经阶段(含学习路线图)
    一、为什么选择网络安全?这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。未来3-5年,是安全行业的黄金发展期,提前踏入行业,能享受行业发展红利。二、为什么说网络安全行......