http://acm.hdu.edu.cn/showproblem.php?pid=5524
问n个节点的完全二叉树有多少种节点个数不同子树
首先如果是满二叉树好判断,否则,可以把它看成一个完全二叉树和另一个非完全二叉树,如此递归下去,每递归一次,结果加一,因为结点个数肯定和其他的不一样
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include <cmath>
typedef long long ll;
using namespace std;
ll ans,maxn,n;
void find(ll x)
{
ll l=x,r=x;
ll dep=0;
while(l*2<=n)
{
l*=2;
dep++;
}
while(r*2+1<=n)
r=r*2+1;
if(l<=r) maxn=max(maxn,dep);//满二叉树
else
{
find(2*x);
find(2*x+1);
ans++;
}
}
int main()
{
while(cin>>n)
{
ans=0;
maxn=0;
find(1);
cout<<ans+maxn+1<<endl;
}
return 0;
}