#include #define show(x) cout << #x << " = " << x << endl using namespace std; using ll = long long; using pii = pair; using vi = vector; template ostream& operator<<(ostream& os, const vector& v) { os << "sz=" << v.size() << "\n["; for (const auto& p : v) { os << p << ","; } os << "]\n"; return os; } template ostream& operator<<(ostream& os, const pair& p) { os << "(" << p.first << "," << p.second << ")"; return os; } constexpr ll MOD = 1e9 + 7; template constexpr T INF = numeric_limits::max() / 100; int main() { int M; cin >> M; const int num = 1 << M; vector S(num); for (ll i = 0; i < num; i++) { cin >> S[i]; } vector rate(num, 0.0); vector prev_rate(num, 1.0); for (int m = 1; m <= M; m++) { const int block_size = 1 << m; for (int i = 0; i < num; i++) { const int block = i / block_size; const bool mini_block = (i % block_size) / (block_size / 2); long double sum = 0; if (mini_block == 0) { for (int j = block_size / 2; j < block_size; j++) { const int p = block * block_size + j; if (p == i) { continue; } sum += prev_rate[i] * prev_rate[p] * (static_cast(S[i] * S[i]) / (S[i] * S[i] + S[p] * S[p])); } } else { for (int j = 0; j < (block_size / 2); j++) { const int p = block * block_size + j; if (p == i) { continue; } sum += prev_rate[i] * prev_rate[p] * (static_cast(S[i] * S[i]) / (S[i] * S[i] + S[p] * S[p])); } } rate[i] = sum; } for (int i = 0; i < num; i++) { prev_rate[i] = rate[i]; } } cout << fixed << setprecision(10) << rate[0] << endl; return 0; }