Solution - P3938 斐波那契
好水的题
思路
LCA 都会吧。
观察到当 \(n = 60\) 时 \(\text{fib}_n > 10^{12}\),于是可知这棵树最多只有 \(60\) 层,对于每个询问暴力跳父亲(编号减去出生时能生育的兔子数)即可。
于是,没了。都说了是水题嘛
代码
#include <bits/stdc++.h>
#define rint register int
#define rllong register long long
#define llong long long
#define SIZ 65
using namespace std;
llong fib[SIZ] = {1, 1, 2};
inline void prework(){
for(rint i = 3; i < SIZ; ++i) fib[i] = fib[i-1]+fib[i-2];
return;
}
inline int dep(rllong x){
if(x == 1) return 1;
return lower_bound(fib+1, fib+SIZ, x)-fib;
}
int t;
int main(){
prework();
scanf("%d", &t);
while(t--){
rllong u, v;
scanf("%lld %lld", &u, &v);
while(u != v){
if(dep(u) > dep(v)) swap(u, v);
v -= fib[dep(v)-1];
}
printf("%lld\n", u);
}
return 0;
}