[CF735C] Tennis Championship
Description
有一个 $ n $ 个节点的二叉树。
要求每个节点的两个儿子的子树最大深度相差不超 $ 1 $,求最大深度。
$ n <= 10^{18} $
Solution
倒过来想,设 (f(x)) 表示深度为 (x) 的这样的二叉树,最少需要多少个点
显然有 (f(x)=f(x-1)+f(x-2))
边界条件 (f(0)=1,f(1)=2) (由题意引发的数值偏移)
于是我们递推出 Fib 数列即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
signed main() {
cin>>n;
int a=1,b=1;
for(int i=1;i<=n;i++) {
int t=b; b=a+b; a=t;
if(b>n) {
cout<<i-1;
break;
}
}
}