题目背景

大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg

题目描述

小 C 养了一些很可爱的兔子。 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定, 在整个过程中兔子不会出现任何意外。

小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代。如果某两对兔子是同时出生的,那么小 C 会将父母标号更小的一对优先标 号。

如果我们把这种关系用图画下来,前六个月大概就是这样的:

其中,一个箭头 A → B 表示 A 是 B 的祖先,相同的颜色表示同一个月出生的兔子。

为了更细致地了解兔子们是如何繁衍的,小 C 找来了一些兔子,并且向你提出了 m 个 问题:她想知道关于每两对兔子 a_iai​ 和 b_ibi​ ,他们的最近公共祖先是谁。你能帮帮小 C 吗?

一对兔子的祖先是这对兔子以及他们父母(如果有的话)的祖先,而最近公共祖先是指 两对兔子所共有的祖先中,离他们的距离之和最近的一对兔子。比如,5 和 7 的最近公共祖 先是 2,1 和 2 的最近公共祖先是 1,6 和 6 的最近公共祖先是 6。

输入输出格式

输入格式:

从标准输入读入数据。 输入第一行,包含一个正整数 m。 输入接下来 m 行,每行包含 2 个正整数,表示 a_iai​ 和 b_ibi​ 。

输出格式:

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

输入输出样例

输入样例#1: 复制

5
1 1
2 3
5 7
7 13
4 12
输出样例#1: 复制

1
1
2
2
4

说明

【数据范围与约定】 子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。 每个测试点的数据规模及特点如下表:


首先考虑70%的数据,

每天新出生的兔子数目一定是f[i],这个很容易计算得出

然后发现,这f[i]只兔子的父亲一定是1~f[i],于是模拟这个过程,做一遍LCA即可

再考虑100%的数据,

n达到int以上,无法模拟,

设s[i]=∑f[1~i],发现第s[i]+1只兔子父亲肯定是1,第s[i]+2只兔子父亲肯定是2,第s[i]+f[i+1]只兔子父亲一定是f[i+1]

于是有思路:二分s数组,使得s[i]+1<=a<=s[i]+f[i+1],这时候a的父亲就是a-s[i]

这样的话一开始a是大于s[i]的,减过之后就小于s[i]了,至少折半,效率至多是O(logn),感觉挺快的

对b也做一遍,记录他们的“祖先历程”,然后用两个指针找一下公共祖先就可以了

实际上我是处理到10^6的,如果小于10^6就直接做倍增了,这样可能快一些,不过事实证明是差不多的

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define ll long long
#define MAXN 1000005
#define LOG 21
using namespace std;
ll read(){
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int fa[LOG][MAXN];
ll M=;
ll dep[MAXN];
ll f[MAXN]={,,};
ll s[MAXN]={,,};
vector<ll> v[];
int lca(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
for(int k=dep[x]-dep[y],p=;k;p++,k>>=){
if(k&){
x=fa[p][x];
}
}
if(x==y){
return x;
}
for(int k=LOG-;k>=;k--){
if(fa[k][x]!=fa[k][y]){
x=fa[k][x],y=fa[k][y];
}
}
return fa[][x];
}
void work(ll a,int t){
ll x=a;
v[t].push_back(x);
while(){
if(x<MAXN){
break;
}
int L=,R=;
while(R-L>){
int mid=(L+R)/;
if(s[mid]<x){
L=mid;
}
else{
R=mid;
}
}
if(s[R]<x){
x=x-s[R];
}
else{
x=x-s[L];
}
v[t].push_back(x);
}
}
void init(){
fa[][]=fa[][]=;
dep[]=dep[]=;
int i=,j=;
while(){
f[i]=f[i-]+f[i-];
s[i]=s[i-]+f[i];
if(s[i]>M){
break;
}
i++;
}
i=;
while(){
for(j=s[i-]+;j<=s[i]&&j<MAXN;j++){
fa[][j]=j-s[i-];
dep[j]=dep[j-s[i-]]+;
}
if(j>=MAXN){
break;
}
i++;
}
for(int k=;k<LOG;k++){
for(int i=;i<MAXN;i++){
fa[k][i]=fa[k-][fa[k-][i]];
}
}
}
void solve(){
int T=read();
while(T--){
ll a=read(),b=read();
if(a==b){
printf("%lld\n",a);
continue;
}
if(a<MAXN&&b<MAXN){
printf("%d\n",lca(a,b));
}
else{
v[].clear(),v[].clear();
work(a,);
work(b,);
int i=,j=,ok=;
while(i<v[].size()&&j<v[].size()){
if(v[][i]==v[][j]){
printf("%lld\n",v[][j]);
ok=;break;
}
if(v[][i]>v[][j]){
i++;
}
else{
j++;
}
}
if(!ok){
a=v[][v[].size()-],b=v[][v[].size()-];
printf("%d\n",lca(a,b));
}
}
}
}
int main()
{
// freopen("data.in","r",stdin);
init();
solve();
return ;
}

洛谷mNOIP模拟赛Day1-斐波那契的更多相关文章

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

    题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...

  2. 洛谷mNOIP模拟赛Day2-入阵曲

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...

  3. NOIP模拟赛T3 斐波那契

    1.题目 求 \[\sum_{i=1}^n \sum_{j=1}^m \gcd(F_i,F_j) \] 其中 \(F_k\) 表示斐波那契数列的第 \(k\) 项,对 \(10^9 + 7\) 取模. ...

  4. 洛谷noip 模拟赛 day1 T3

    T7983 大芳的逆行板载 题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇 ...

  5. 洛谷mNOIP模拟赛Day2-星空

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. ...

  6. 洛谷mNOIP模拟赛Day1-分组

    传送门 首先是贪心的思路 从后向前选,能多选就多选, 理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小 对于K==1,枚举1~512直接判断 对于K==2,需要用镜像并查集,来刻画" ...

  7. 洛谷mNOIP模拟赛Day2-将军令

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...

  8. 洛谷mNOIP模拟赛Day1-数颜色

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

  9. 洛谷noip 模拟赛 day1 T1

    T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...

随机推荐

  1. SQLAlchemy 教程 —— 基础入门篇

    SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...

  2. python的测试

    测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...

  3. 视频聊天 Demo

    ESFramework Demo -- 入门Demo,简单的即时通讯系统(附源码) 是基于ESFramework实现的一个简单的文字聊天demo,现在,我们将在这个demo的基础上,使用OMCS为其增 ...

  4. centos 开放端口

    1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...

  5. Hibernate实体类注解解释

    Hibernate注解1.@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2.@Table(name="",cat ...

  6. UVA 10622 Perfect P-th Powers

    https://vjudge.net/problem/UVA-10622 将n分解质因数,指数的gcd就是答案 如果n是负数,将答案除2至奇数 原理:(a*b)^p=a^p*b^p #include& ...

  7. Python-迭代器&生成器&装饰器&软件目录结构规范-Day5

    目录Day-Python-迭代器&生成器 21.生成器 21.1.生成器引入 21.2.生成器作用 31.3.创建生成器的方法 31.4.用函数来实现复杂的生成器 51.5.把函数变成生成器通 ...

  8. WPF 自定义RadioButton样式

    一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...

  9. gogs详细配置

    sudo apt-get update sudo apt-get upgrade sudo adduser git //创建用户  密码 ******* su git//切换到git用户 cd ~   ...

  10. 安装 docker-compose

    安装Docker-Compose之前,请先安装 python-pip,安装好pip之后,就可以安装Docker-Compose了. 一.检查是否已经安装 二.安装 docker-compose 1.安 ...