// 想定解法: DP #include using namespace std; void rc(int v,int mn,int mx){if(v= 0) return dp[m][i]; int p = 1<<(m-1), p2 = p*2; int j = i/p2*p2, k = i/p*p; if(j == k) j += p; double t = 0; for(int l = j; l < j+p; l++){ t += dfs(m-1,l) * S[i] / (S[i]+S[l]); } return dp[m][i] = t * dfs(m-1, i); } int main(){ cin >> M; rc(M, 1, MAX); int n = 1 << M; REP(i, n){ cin >> S[i]; rc(S[i], 1, 30000); S[i] *= S[i]; dp[0][i] = 1.0; } REP(i,M) REP(j,n) dp[i+1][j] = -1; REP(j,n) dp[0][j] = 1.0; cout << fixed << setprecision(16) << dfs(M,0) << endl; return 0; }