[洛谷P3938]:斐波那契(fibonacci)(数学)

题目传送门


题目描述

小$C$养了一些很可爱的兔子。
有一天,小$C$突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定,在整个过程中兔子不会出现任何意外。
小$C$把兔子按出生顺序,把兔子们从$1$开始标号,并且小$C$的兔子都是$1$号兔子和$1$号兔子的后代。如果某两对兔子是同时出生的,那么小$C$会将父母标号更小的一对优先标号。
如果我们把这种关系用图画下来,前六个月大概就是这样的:

其中,一个箭头$A\rightarrow B$表示$A$是$B$的祖先,相同的颜色表示同一个月出生的兔子。
为了更细致地了解兔子们是如何繁衍的,小$C$找来了一些兔子,并且向你提出了$m$个问题:她想知道关于每两对兔子$a_i$和$b_i$,他们的最近公共祖先是谁。你能帮帮小$C$吗? 一对兔子的祖先是这对兔子以及他们父母(如果有的话)的祖先,而最近公共祖先是指两对兔子所共有的祖先中,离他们的距离之和最近的一对兔子。比如,$5$和$7$的最近公共祖先是$2$,$1$和$2$的最近公共祖先是$1$,$6$和$6$的最近公共祖先是$6$。


输入格式

输入第一行,包含一个正整数$m$。
输入接下来$m$行,每行包含$2$个正整数,表示$a_i$和$b_i$。


输出格式

输入一共$m$行,每行一个正整数,依次表示你对问题的答案。


样例

样例输入1:

5
1 1
2 3
5 7
7 13
4 12

样例输出1:

1
1
2
2
4

样例输入2:

10
13 5
13 6
13 7
13 8
13 9
13 10
13 11
13 12
13 13
13 14

样例输出2:

5
1
2
1
1
2
1
1
13
1


数据范围与提示

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解决一部分测试数据。
每个测试点的数据规模及特点如下表:
测试点     $m$                      $a_i,b_i$           特殊性质$1$           特殊性质$2$
  $1$          $\leqslant 11$                  $\leqslant 15$                  $\surd$                         $\surd$
  $2$          $\leqslant 12$                  $\leqslant 15$                  $\times$                         $\times$
  $3$          $\leqslant 13$                  $\leqslant 1000$             $\surd$                         $\times$
  $4$          $\leqslant 14$                  $\leqslant 1000$             $\times$                         $\times$
  $5$          $\leqslant 1005$             $\leqslant{10}^6$                $\surd$                        $\times$
  $6$          $\leqslant 1006$             $\leqslant{10}^6$                $\times$                        $\surd$
  $7$          $\leqslant 1007$             $\leqslant{10}^6$                $\times$                        $\times$
  $8$          $\leqslant 300008$        $\leqslant{10}^{12}$              $\surd$                        $\times$
  $9$          $\leqslant 300009$        $\leqslant{10}^{12}$              $\times$                        $\surd$
  $10$        $\leqslant 300010$        $\leqslant{10}^{12}$              $\times$                        $\times$

特殊性质$1$:保证$a_i,b_i$均为某一个月出生的兔子中标号最大的一对兔子。例如,对于前六个月,标号最大的兔子分别是$1,2,3,5,8,13$。
特殊性质$2$:保证$|a_i,b_i|\leqslant 1$。


题解

考场上$20$分钟切掉这道题,我感觉还是蛮爽的。

$20\%$算法:

直接手动打表,注意$14$是$1$的儿子,而$15$则是$2$的儿子,挺费眼睛的,而且一开始我打了一个表还没打对……

时间复杂度:$\Theta(m)$。

期望得分:$20$分。

$40\%$算法:

直接暴力建树,每次询问都暴力把这棵树重新建一遍来找父亲。

我觉得写这种方法的就是$\times \times \times$,不用管他……

时间复杂度:$\Theta(m\times {|a|}^2\times \log|a|)$($|a|$表示$a_i,b_i$的值域)。

期望得分:$40$分。

$60\%$算法:

考虑$QJ$两个特殊情况:

特殊情况$1$:

  某一个月出生的标号最大的兔子就是斐波那契数列中的一项,画一张图,如下:

  

  我们便会惊喜的发现如果这两只兔子同是斐波那契数列的奇数项或偶数项,那么它们的最近公共祖先就是他们当中较小的那个;否则,它们的最近公共祖先为$1$。

特殊情况$2$:

  如果两只兔子的标号的绝对值等于$1$,则他们的最近公共祖先一定为$1$。

$70\%$算法:

可能细心的你会发现,一个节点一定小于自己儿子的一半,所以我们可以暴力网上找,最多有$\log i$层。

时间复杂度:$\Theta(n+m\log n)$。

期望得分:$70$分。

$100\%$算法:

在考场上,我惊喜的发现了一个规律,一个节点的减去比它小的那个斐波那契数就是他的父亲节点,所以我们可以每次让两个点中更小的那个暴力往上抬,直到相同为止即可。

时间复杂度:$\Theta(60\times m)$。

期望得分:$100$分。


代码时刻

$20\%$算法:

#include<bits/stdc++.h>
using namespace std;
int Map[16][16]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,1,2,1,1,2,1,2,1,1,2,1,1,2,1,2,
0,1,1,3,1,1,1,1,3,1,1,3,1,1,1,1,
0,1,1,1,4,1,1,1,1,1,1,1,4,1,1,1,
0,1,2,1,1,5,1,2,1,1,2,1,1,5,1,2,
0,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,
0,1,2,1,1,2,1,7,1,1,2,1,1,2,1,2,
0,1,1,3,1,1,1,1,8,1,1,3,1,1,1,1,
0,1,1,1,1,1,1,1,1,9,1,1,1,1,1,1,
0,1,2,1,1,2,1,2,1,1,10,1,1,2,1,2,
0,1,1,3,1,1,1,1,3,1,1,11,1,1,1,1,
0,1,1,1,4,1,1,1,1,1,1,1,12,1,1,1,
0,1,2,1,1,5,1,2,1,1,2,1,1,13,1,2,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,14,1,
0,1,2,1,1,2,1,2,1,1,2,1,1,2,1,15};
int main()
{
	int m;
	scanf("%d",&m);
	while(m--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",Map[a][b]);
	}
	return 0;
}

$60\%$算法:

#include<bits/stdc++.h>
using namespace std;
int m;
long long fi[60];
int getnum(long long x)
{
	int res;
	for(int i=1;i<=59;i++)if(fi[i]==x){res=i;break;}
	return res;
}
int main()
{
	scanf("%d",&m);
	fi[0]=fi[1]=1;
	for(int i=2;i<=59;i++)
		fi[i]=fi[i-1]+fi[i-2];
	for(int i=1;i<=m;i++)
	{
		long long a,b;
		scanf("%lld%lld",&a,&b);
		if(a==b){printf("%lld\n",a);continue;}
		if(a-b==1||b-a==1){puts("1");continue;}
		int numa=getnum(a),numb=getnum(b);
		if(numa!=-1&&numb!=-1&&(numa&1)==(numb&1))printf("%lld\n",min(a,b));
		else puts("1");
	}
	return 0;
}

$70\%$算法:

#include<bits/stdc++.h>
using namespace std;
int m;
struct rec
{
	int nxt;
	int to;
}e[1000001];
int head[1000001],cnt;
int t[1000001],tot=1,tmp,depth[1000001],fa[1000001][23];
bool flag;
void add(int st,int to)
{
	e[++cnt].to=to;
	e[cnt].nxt=head[st];
	head[st]=cnt;
}
void build()
{
	t[1]=1;
	for(int x=1;x<30;x++)
	{
		tmp=tot;
		for(int i=1;i<=tot;i++)
		{
			t[i]++;
			if(t[i]>1)add(i,++tmp);
			if(tmp>=1000000)return;
		}
		tot=tmp;
	}
}
void dfs(int x)
{
	for(int i=head[x];i;i=e[i].nxt)
	{
		if(depth[e[i].to])continue;
		depth[e[i].to]=depth[x]+1;
		fa[e[i].to][0]=x;
		for(int j=1;j<=21;j++)
			fa[e[i].to][j]=fa[fa[e[i].to][j-1]][j-1];
		dfs(e[i].to);
	}
}
int LCA(int x,int y)
{
    if(depth[x]>depth[y])swap(x,y);
    for(int i=21;i>=0;i--)
        if(depth[fa[y][i]]>=depth[x])y=fa[y][i];
    if(x==y)return x;
    for(int i=21;i>=0;i--)
        if(fa[x][i]!=fa[y][i])
        {
            x=fa[x][i]; 
            y=fa[y][i];
        }
    return fa[x][0];
}
int main()
{
	scanf("%d",&m);
	build();
	depth[1]=1;
	dfs(1);
	while(m--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",LCA(a,b));
	}
	return 0;
}

$100\%$算法:

#include<bits/stdc++.h>
using namespace std;
int m;
long long fi[61];
long long LCA(long long x,long long y)
{
	while(1)
	{
		if(x==y)return x;
		if(x>y){for(int i=1;i<=65;i++)if(fi[i]<x&&fi[i+1]>=x){x-=fi[i];break;}}
		else for(int i=1;i<=65;i++)if(fi[i]<y&&fi[i+1]>=y){y-=fi[i];break;}
	}
}
int main()
{
	fi[1]=fi[2]=1;
	for(int i=3;i<=60;i++)
		fi[i]=fi[i-1]+fi[i-2];
	scanf("%d",&m);
	while(m--)
	{
		long long a,b;
		scanf("%lld%lld",&a,&b);
		printf("%lld\n",LCA(a,b));
	}
	return 0;
}
 

rp++

转载于:https://www.cnblogs.com/wzc521/p/11294668.html

别再手动填数据了!Vivado里用.coe文件给ROM IP核预装数据的保姆级教程 本文详细介绍了在Vivado中使用.coe文件为ROM IP核预装数据的全流程教程,包括文件格式规范、数据转换技巧和Vivado配置指南。通过自动化数据加载,开发者可以显著提升FPGA开发效率,避免手动输入错误,适用于查找表、波形存储等多种应用场景。 阅读详情

相关推荐

告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例)

本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。

weixin_30336061的博客 311

斐波那契

题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。 小 C 把兔子按出生顺序,把兔子们...

weixin_30819085的博客 192

​​EMC设计实战:BCI(大电流注入)硬件设计规范

LIN接口:集成TVS管(如PESD5V0S1BL)与共模电感,耐压等级≥20V(8kV HBM)。输入滤波:10μF电解电容(100kHz截止)+ 0.1μF陶瓷电容(10MHz截止)。​:全频段(1MHz-400MHz)注入200mA电流,LIN通信误码率<0.01%。对敏感电路(如传感器)采用隔离电源(如ADuM5000),隔离电压≥3kVrms。​:连续波(CW)与调幅波(AM,调制深度80%)组合,覆盖全频段干扰场景。​:选择低频段(1-100MHz)感量≥100μH的绕线电感,抑制共模电流。

m0_50833886的博客 1938

洛谷B2064 斐波那契数列

洛谷B2064 斐波那契数列

旺旺的碎冰冰~的博客 1214

Altium Designer实战:手把手教你设计智能车竞赛疯狂电路组赛道(附封装库)

本文详细介绍了使用Altium Designer软件进行智能车竞赛“疯狂电路”组赛道设计的全流程实战指南。从理解比赛规则、搭建设计环境、创建专用元器件封装库,到电路布局、路径规划及设计输出验证,手把手教你高效完成符合计分标准的赛道图纸设计,并附上实用的封装库管理方法。

alice7model的博客 1322

yolov5深度剖析+源码debug级讲解系列(一) yolov5的架构和源码debug准备

前言 前段时间分析了yolov3的源码,这次想带着小伙伴一起把yolov5完全掌握。博主还是保持着一贯的风格,依旧采用debug级别的源码剖析。目的就是让大家可以通过一个系列的文章就把yolov5的架构、设计理念和每一行源码都弄懂。只要小伙伴可以花时间把这个系列读完,就会对yolov5的理解有所提升。 去年参加了kaggle的小麦检测比赛,yolov5在比赛的中段开始呈现霸榜趋势,超越了efficientdet。虽然最后yolov5因为权限等某些问题被kaggle官方禁用了,但是仍然体现出了其强大的能力。值

人唯优的博客 4万+

洛谷 P3986 斐波那契数列

洛谷 P3986 斐波那契数列

2301_81161051的博客 1193

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 454

斐波那契数列 (洛谷 B2064 斐波那契数列)

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1<=a<=30)。斐波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都等于前面 2个数之和。输出有n行,每行输出对应一个输入。输出应是一个正整数,为斐波那契数列中第a个数的大小。给出一个正整数a,要求斐波那契数列中第a个数是多少。

2301_81986557的博客 973

大模型训练和推理

大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。

weixin_45325331的博客 6024

国科大《人工智能原理与算法》2021年期末试题+2024经验(2025指南)

2021年期末试题+24年复习指南

MatsumotoChrikk 2928

【斐波那契数组篇】妙解熟知的斐波那契问题(毫无压力版)

还在被斐波那契数组的解答困扰???本篇就来带你解答洛谷的斐波那契数组问题

羑悻的博客. 1432

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2306

【洛谷mNOIP模拟赛Day1】T1 斐波那契

题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其父亲必为$x-Fk$($F$为斐波那契数列,且$F_{k}$为不大于$x$的最大数字),举个例子:$7-5=2$,$11-8=3$,对于点$x$和点$y$,我们分别求出其所有直系祖宗,然...

diaoyoutun2652的博客 211

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

洛谷 P2020 [NOI2011] 兔农 题解

对于小规模数据,直接递推即可;对于大规模数据,需要结合矩阵快速幂和动态修正的方法。但死亡条件的动态性使得纯矩阵快速幂难以直接应用,因此递推方法在本题中更为实用。

2401_86601498的博客 420

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

洛谷模拟赛 mNOIP DAY1

100+45+12 QAQ基本全是暴力 T1:找规律+模拟(70分树剖+30分乱搞) 题目描述小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都

zhn_666的博客 417

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【题解】斐波拉契 luogu3938

题目 题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。 小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代。如果某两对兔子是同时出生...

C@bMv7GRVt)Q 367

P3938 斐波那契(lca)

P3938斐波那契https://www.luogu.com.cn/problem/P3938 #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <cstring> #include .

Ghostttttttiii的博客 299

【洛谷P3938】斐波那契——杨子曰题目

【洛谷P3938】斐波那契——杨子曰题目 超链接:数学合集 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何...

杨子曰:代码是神奇的 664

P3938 斐波那契

坑爹入口 我们想一下,第几个生的。那他的孩子就是排在新一波出生的第几个上的。 然后我们通过瞎试得到。10^12<斐波那契的第60项。就是说我们不用建图(也建不下),每次最多60次暴力就可以了。 出题人真是个人才。 #include<cstdio> #include<iostream> #include<algorithm> using namespace ...

weixin_34351321的博客 205

洛谷 P3938 斐波那契

斐波那契的应用

tangzhide123yy的博客 465

[NOIP2017模拟][洛谷3938]斐波那契

题目背景 洛谷 mNOIP 模拟赛 Day1 洛谷3938题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔

g19zwk的博客 508

【洛谷1962】 斐波那契数列

题面题目背景大家都知道,斐波那契数列是满足如下性质的一个数列:• f(1) = 1• f(2) = 1• f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)题目描述请你求出 f(n) mod 1000000007 的值。输入格式:·第 1 行:一个整数 n输出格式:第 1 行: f(n) mod 1000000007 的值输入输出样例输入样例#1:5输出样例#1:5输入样例

小蒟蒻yyb的博客 1081

洛谷P1962 斐波那契数列

题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1)=1f(1)=1 • f(2)=1f(2)=1 • f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)(n≥2n≥2且nn为整数)题目描述 请你求出 f(n)f(n) mod 1000000007 的值。输入格式 第1行:一个整数nn输出格式 第1行:f(n)f(n) mod 1000000

Canopus 502

洛谷3938 斐波那契

标签:数论,LCA,树 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定,在整个过程中兔子不会出现任何意外。 小 C 把兔子按出生顺

Welcome to yjjr's blog! 1022

2020 10.24 洛谷普及模拟 1. 斐波那契

:--------------:2020 10.24 洛谷普及模拟 1. 斐波那契 1 问题描述 斐波那契数列(Fibonacci sequence),⼜称⻩⾦分割数列,因数学家列昂纳多·斐波那契 (Leonardoda Fibonacci)以兔⼦繁殖为例⼦⽽引⼊,故⼜称为“兔⼦数列”。指的是这样⼀个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . . 在数学上,斐波纳契数列被以递推的⽅法定义: F0=0,F1=1,Fn=Fn1+Fn2(n>2,n∈N∗)F0 = 0,

天空之心 293
上一篇: 双网卡主机无法管理的故障
下一篇: [洛谷P3939]:数颜色(二分)
badiu_30394251
博客等级 码龄11年 124粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值