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

题目传送门:https://www.luogu.org/problemnew/show/P3938

这题出得特别吼啊~~

通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子x,其父亲必为xFkF为斐波那契数列,且Fk为不大于x的最大数字),举个例子:75=2118=3,对于点x和点y,我们分别求出其所有直系祖宗,然后扫一遍即可。

由于斐波那契数列为指数级增长,故向上跳的复杂度为一个log级别,时间复杂度为O(mlog(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 }
复制代码

 

 

posted @   AlphaInf  阅读(240)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示