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;
}

posted @ 2025-05-05 10:33  Hootime  阅读(6)  评论(0)    收藏  举报