标签里的lca是什么鬼,用lca不就炸了吗?
观察可知,子节点减去父节点为子节点在斐波那契数列中的前继。
于是我们可以二分查找第一个小于子节点的斐波那契数,从而实现向上跳一级。(实现过程和lca有一点点像)
跳的时候选大的,即深度深的那个节点跳。
记得开longlong。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,a,b,f[100];
int find(int x){
int l=1,r=60;
while(l<=r){
int mid=(l+r)/2;
if(f[mid]>=x)r=mid-1;
else l=mid+1;
}
return f[l-1];
}
signed main(){
scanf("%lld",&t);
f[1]=1;
for(int i=2;i<=60;++i)f[i]=f[i-1]+f[i-2];
while(t--){
scanf("%lld%lld",&a,&b);
while(a!=b){
if(a>b)a-=find(a);
if(b>a)b-=find(b);
}
printf("%lld\n",a);
}
return 0;
}