【洛谷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$,我们分别求出其所有直系祖宗,然后扫一遍即可。

由于斐波那契数列为指数级增长,故向上跳的复杂度为一个$log$级别,时间复杂度为$O(m*log(max(x_{i},y_{i})))$。

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 }
时间: 2024-10-04 18:14:54

【洛谷mNOIP模拟赛Day1】T1 斐波那契的相关文章

洛谷mNOIP模拟赛Day1-斐波那契

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

洛谷mNOIP模拟赛Day2-入阵曲

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整个世界都焕然一新.这世界上怎么会有这么多奇妙的东西?曾经自己觉得难以 解决的问题,被一个又一个算法轻松解决. 小 F 当时暗自觉得,与自己的幼稚相比起来,还有好多要学习的呢. 一年过

洛谷mNOIP模拟赛Day1-分组

传送门 首先是贪心的思路 从后向前选,能多选就多选, 理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小 对于K==1,枚举1~512直接判断 对于K==2,需要用镜像并查集,来刻画"敌对关系",如果a和b产生矛盾,就把a和b的镜像(b')连接 ,b和a'连接,然后判断自己是不是和自己的镜像连接了 打上时间戳避免清零卡常 1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4

洛谷mNOIP模拟赛Day1-数颜色

传送门 题目大意: 给定一个序列,维护每个数字在[L,R]出现的次数以及交换a[x]和a[x+1]的操作 一开始想的分桶法,感觉复杂度还可以吧,常数有点大,于是死得很惨(65分) 1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 #include<

洛谷mNOIP模拟赛Day2-将军令

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前

【2017.11.2】洛谷 mNOIP 比赛 | T1 斐波那契【找规律】

Day 1 T1  斐波那契 找规律. 我们发现,兔子的编号减去斐波那契数列中第一个比它小的数之后就可以得到它的父亲.一直找减找减找减...就ok了. 题解(%%%dalao's 代码)

2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

回形遍历( calc .cpp/c/pas) 时间限制:1s内存 限制: 256MB [问题 描 述]给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子. [输入]输入文件名为 calc.in.一行,包含五个整数:n,m,x,y,z[输出]输出文件名为 calc.out.输出一行,包含两个整数,表示所在格子的横纵坐标[输入输出样例] calc .in calc .out 4 5 3 0 5 2 4 [ 样例解释 ] [数据说明]对于 70%的数据,1<=n,m,

【模拟】XMU 1599 斐波那契汤

题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1599 题目大意: 给k,m,q以及f[1]...f[k],当n<m时,f[n]=f[1]/2+f[2]/2...f[n-1]/2, n>=m时 F(n)=F(n-1) XOR F(n-2) XOR……XOR F(n-m); n>m. 求F(L) xor F(L+1) xor …… xor F(R). (1 =< k <=m <=1e5,且m-k<64:

斐波那契数列的通项公式x+洛谷P2626x

#include<cstdio> #include<iostream> #include<cmath> using namespace std; int main() { int n; scanf("%d",&n); n--; double q=sqrt(5.0); int ans; ans=((pow((1+q)/2.0,n)/q-(pow((1-q)/2.0,n)/n))); cout<<ans<<endl; re