hdu5524 Subtrees

http://acm.hdu.edu.cn/showproblem.php?pid=5524
问n个节点的完全二叉树有多少种节点个数不同子树
首先如果是满二叉树好判断,否则,可以把它看成一个完全二叉树和另一个非完全二叉树,如此递归下去,每递归一次,结果加一,因为结点个数肯定和其他的不一样

#include
#include
#include
#include
#include 
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<1<return 0;
}

你可能感兴趣的:(hdu)