/fn/ll
换了114514个写法,全都一样/fn
思路是找到可行的就删
arr fib,ifib,sz,faa,t,tag;
#undef fe
#define fe(x) for(auto v:G[x]){
std::set<int>G[200005];
void a1ddedge(int u,int v,int w)
{
G[u].insert(v);
G[v].insert(u);
}
int cc,Cc,n;
void dfs(int u,int fa)
{
t[++Cc]=u;
sz[u]=1;
fe(u)
if(v==fa)continue;
dfs(v,u);sz[u]+=sz[v];faa[v]=u;
gr
}
void dfs2(int u,int fa)
{
fe(u)
if(v==fa)continue;
dfs2(v,u);
gr
tag[u]=cc;
}
void rmv(int u,int v)
{
G[u].erase(v);
G[v].erase(u);
}
void solve(int x,int d)
{
// odp(x,d);
if(d==-1)
{
puts("NO");
exit(0);
}
if(d<=1)return;
// if(d==0)
// {
// puts("NO");
// exit(0);
// }
Cc=0;
dfs(x,x);
rg(Cc)
if(sz[t[i]]==fib[d-2])
{
rmv(t[i],faa[t[i]]);
solve(t[i],d-2);
solve(faa[t[i]],d-1);
return;
}
if(sz[t[i]]==fib[d-1])
{
rmv(t[i],faa[t[i]]);
solve(t[i],d-1);
solve(faa[t[i]],d-2);
return;
}
gr
puts("NO");
// if(n==fib[25])printf("no on %d %d.\n",x,d);
exit(0);
}
signed main()
{
n=read();rg(n-1)int u=read(),v=read();a1ddedge(u,v,1),a1ddedge(v,u,1);gr
fib[0]=fib[1]=1;
memset(ifib,-1,sizeof(ifib));
rg(26)if(i>1)fib[i]=fib[i-1]+fib[i-2];gr
rg(26)ifib[fib[i]]=i;gr
// odl(fib[25]);
// tag[1]=cc=1;
solve(1,ifib[n]);
puts("YES");
return 0;
}