#include <cmath>
#include <stack>
#include <tuple>
int M1(int H, int T){
if (H == 0) return T;
if (H + 1 >= T) return pow(2, T) - 1;
return M1(H - 1, T - 1) + M1(H, T - 1) + 1;
}
struct Data
{
public:
Data(int newH, int newT)
: T(newT), H(newH)
{
}
int H;
int T;
};
int M(int H, int T)
{
std::stack<Data> st;
st.push(Data(H, T));
int sum = 0;
while (st.size() > 0)
{
Data top = st.top();
st.pop();
if (top.T + 1 >= top.T)
sum += pow(2, top.T) - 1;
else
{
st.push(Data(top.H - 1, top.T - 1));
st.push(Data(top.H, top.T - 1));
sum += 1;
}
}
return sum;
}
int main(int argc, char * argv[])
{
printf("Original: %d Iterative: %d\n", M1(5, 2), M(5, 2));
getchar();
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDx0dXBsZT4KCmludCBNMShpbnQgSCwgaW50IFQpewoJaWYgKEggPT0gMCkgcmV0dXJuIFQ7CglpZiAoSCArIDEgPj0gVCkgcmV0dXJuIHBvdygyLCBUKSAtIDE7CglyZXR1cm4gTTEoSCAtIDEsIFQgLSAxKSArIE0xKEgsIFQgLSAxKSArIDE7Cn0KCglzdHJ1Y3QgRGF0YQoJewoJcHVibGljOgoJCURhdGEoaW50IG5ld0gsIGludCBuZXdUKQoJCQk6IFQobmV3VCksIEgobmV3SCkKCQl7CgoJCX0KCgkJaW50IEg7CgkJaW50IFQ7Cgl9OwoKCWludCBNKGludCBILCBpbnQgVCkKCXsKCQlzdGQ6OnN0YWNrPERhdGE+IHN0OwoKCQlzdC5wdXNoKERhdGEoSCwgVCkpOwoKCQlpbnQgc3VtID0gMDsKCgkJd2hpbGUgKHN0LnNpemUoKSA+IDApCgkJewoJCQlEYXRhIHRvcCA9IHN0LnRvcCgpOwoJCQlzdC5wb3AoKTsKCgkJCWlmICh0b3AuVCArIDEgPj0gdG9wLlQpCgkJCQlzdW0gKz0gcG93KDIsIHRvcC5UKSAtIDE7CgkJCWVsc2UKCQkJewoJCQkJc3QucHVzaChEYXRhKHRvcC5IIC0gMSwgdG9wLlQgLSAxKSk7CgkJCQlzdC5wdXNoKERhdGEodG9wLkgsIHRvcC5UIC0gMSkpOwoJCQkJc3VtICs9IDE7CgkJCX0KCQl9CgoJCXJldHVybiBzdW07Cgl9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkKewoJcHJpbnRmKCJPcmlnaW5hbDogJWQgSXRlcmF0aXZlOiAlZFxuIiwgTTEoNSwgMiksIE0oNSwgMikpOwoJZ2V0Y2hhcigpOwp9