P3938

斐波那契

题意描述

img

输入

5
1 1
2 3
5 7
7 13
4 12

输出

1
1
2
2
4

点拨

根据题目去找规律,每一个儿子与父亲结点具有斐波那契数的规律,我们只需要每次找到该数在斐波那契数列里面的位置,减去离它最近的斐波那契数就是他的父亲结点
不断递推即可找到共同的祖先

代码

#include <iostream>
using namespace std;
typedef long long ll;
ll sam[65];
ll check(ll x){
	ll l = 1,r = 60;
	while(l < r){
		ll mid = l + r + 1 >> 1;
		if(sam[mid] < x){
			l = mid;
		}
		else r = mid - 1;
	}
//	cout << l <<endl;
	return sam[l];
}
int main() {
	ll n;
	cin >> n;
	sam[1] = sam[2] = 1;
	for ( int i = 3;i <= 60;i++) sam[i] = sam[i-1] + sam[i-2];
//	cout << sam[60] << endl;
	while(n--){
		ll a,b;
		cin >>a >>b;
		while(a!=b){
			if(a < b)
			{
				ll index = check(b);
				b -= index;
			}
			if(b < a){
				ll index = check(a);
				a -= index;
			}
		}
		cout << a <<endl;
	}
	return 0;
}
posted @ 2022-03-24 21:52  Sun-Wind  阅读(33)  评论(0编辑  收藏  举报