【洛谷mNOIP模拟赛Day1】T1 斐波那契
题目传送门:https://www.luogu.org/problemnew/show/P3938
这题出得特别吼啊~~
通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子x,其父亲必为x−Fk(F为斐波那契数列,且Fk为不大于x的最大数字),举个例子:7−5=2,11−8=3,对于点x和点y,我们分别求出其所有直系祖宗,然后扫一遍即可。
由于斐波那契数列为指数级增长,故向上跳的复杂度为一个log级别,时间复杂度为O(m∗log(max(xi,yi)))。
PS:最初我的想法是对于x的每一个祖宗都与y的祖宗进行比对,结果发现时间复杂度为增多一个log,有被卡风险,故写了该题解的做法。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define L long long 5 #define M 65 6 using namespace std; 7 L f[M]={0},fa[M]={0},fb[M]={0},an,bn; 8 int main(){ 9 f[1]=1; f[2]=1; for(int i=3;i<M;i++) f[i]=f[i-1]+f[i-2]; 10 int cas; cin>>cas; while(cas--){ 11 //int x,y; scanf("%d%d",&x,&y); 12 L x,y; scanf("%lld%lld",&x,&y); 13 memset(fa,0,sizeof(fa)); memset(fb,0,sizeof(fb)); an=bn=0; 14 int t=1; while(f[t]<x) t++; 15 while(f[t]){ 16 while(f[t]>=x) t--; 17 fa[++an]=x; x-=f[t]; 18 } 19 t=1; while(f[t]<y) t++; 20 while(f[t]){ 21 while(f[t]>=y) t--; 22 fb[++bn]=y; y-=f[t]; 23 } 24 int i,j; 25 for(i=an,j=bn;fa[i]==fb[j]&&i&&j;i--,j--); 26 printf("%lld\n",fa[i+1]); 27 //cout<<fa[i+1]<<endl; 28 } 29 30 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!