#include <type_traits>
using REAL = double;
template <int P>
constexpr typename std::enable_if<P == 0, REAL>::type
const_pow(REAL ) { return 1.0; }
template <int P>
constexpr typename std::enable_if<P == 1, REAL>::type
const_pow(REAL value) { return value; }
template <int P>
constexpr typename std::enable_if<P == 2, REAL>::type
const_pow( REAL value ) { return value * value; }
template <int P>
constexpr typename std::enable_if<2 < P, REAL>::type
const_pow(REAL value)
{
return const_pow<2>(const_pow<P / 2>(value)) * const_pow<P % 2>(value);
}
template <int P>
constexpr typename std::enable_if<P < 0, REAL>::type
const_pow(REAL value) { return const_pow<-P>(1.0 / value); }
static_assert(0.5 == const_pow<-1>(2.), "Unepected result");
static_assert(1. == const_pow<0>(2.), "Unepected result");
static_assert(2. == const_pow<1>(2.), "Unepected result");
static_assert(4 == const_pow<2>(2.), "Unepected result");
static_assert(8 == const_pow<3>(2.), "Unepected result");
static_assert(2048 == const_pow<11>(2.), "Unepected result");
int main()
{
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgUkVBTCA9IGRvdWJsZTsKCnRlbXBsYXRlIDxpbnQgUD4KY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPFAgPT0gMCwgUkVBTD46OnR5cGUKY29uc3RfcG93KFJFQUwgKSB7IHJldHVybiAxLjA7IH0KCnRlbXBsYXRlIDxpbnQgUD4KY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPFAgPT0gMSwgUkVBTD46OnR5cGUKY29uc3RfcG93KFJFQUwgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9Cgp0ZW1wbGF0ZSA8aW50IFA+CmNvbnN0ZXhwciB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxQID09IDIsIFJFQUw+Ojp0eXBlCmNvbnN0X3BvdyggUkVBTCB2YWx1ZSApIHsgcmV0dXJuIHZhbHVlICogdmFsdWU7IH0KCnRlbXBsYXRlIDxpbnQgUD4KY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPDIgPCBQLCBSRUFMPjo6dHlwZQpjb25zdF9wb3coUkVBTCB2YWx1ZSkKewogICAgcmV0dXJuIGNvbnN0X3BvdzwyPihjb25zdF9wb3c8UCAvIDI+KHZhbHVlKSkgKiBjb25zdF9wb3c8UCAlIDI+KHZhbHVlKTsKfQoKdGVtcGxhdGUgPGludCBQPgpjb25zdGV4cHIgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8UCA8IDAsIFJFQUw+Ojp0eXBlCmNvbnN0X3BvdyhSRUFMIHZhbHVlKSB7IHJldHVybiBjb25zdF9wb3c8LVA+KDEuMCAvIHZhbHVlKTsgfQoKCnN0YXRpY19hc3NlcnQoMC41ID09IGNvbnN0X3BvdzwtMT4oMi4pLCAiVW5lcGVjdGVkIHJlc3VsdCIpOwpzdGF0aWNfYXNzZXJ0KDEuID09IGNvbnN0X3BvdzwwPigyLiksICJVbmVwZWN0ZWQgcmVzdWx0Iik7CnN0YXRpY19hc3NlcnQoMi4gPT0gY29uc3RfcG93PDE+KDIuKSwgIlVuZXBlY3RlZCByZXN1bHQiKTsKc3RhdGljX2Fzc2VydCg0ID09IGNvbnN0X3BvdzwyPigyLiksICJVbmVwZWN0ZWQgcmVzdWx0Iik7CnN0YXRpY19hc3NlcnQoOCA9PSBjb25zdF9wb3c8Mz4oMi4pLCAiVW5lcGVjdGVkIHJlc3VsdCIpOwpzdGF0aWNfYXNzZXJ0KDIwNDggPT0gY29uc3RfcG93PDExPigyLiksICJVbmVwZWN0ZWQgcmVzdWx0Iik7CgoKaW50IG1haW4oKQp7CiAgICByZXR1cm4gMDsKfQo=