#include <iostream>

using namespace std;

typedef unsigned      Number;
typedef unsigned long Count;

template<unsigned CFN>
Count cntFor(const Number n)
{
  if(n<CFN)
    return cntFor<CFN/2>(n);
  return cntFor<CFN>(n-CFN) + cntFor<CFN/2>(n);
}

template<>
Count cntFor<1>(const Number n)
{
  return 1;
}

template<>
Count cntFor<2>(const Number n)
{
  if(n<=1)
    return 1;
  if(n<=2)
    return 2;
  return cntFor<2>(n-2) + cntFor<1>(n-1);
}

int main(void)
{
  const Number i = 1024;
  //for(Number i=1; i<=8; ++i)
    cout << i << " == " << cntFor<512>(i) << endl;
}
