#include #include #include #include #include #include #include using namespace std; const double EPS = 1e-9; int main() { map, double> rrefdp; auto win = [&](double up, int src, int amt) -> double { tuple key = {up, src, amt}; if(rrefdp.count(key)) return rrefdp[key]; vector> dp(amt+1); for(auto& x: dp) x.resize(amt+2); for(int i = 0; i <= amt; i++) { dp[i][i] = 1; if(i == 0) { continue; } if(i == amt) { dp[i].back() = 1; continue; } dp[i][i+1] = -up; dp[i][i-1] = -(1-up); } int rnk = 0; for(int j = 0; j <= amt; j++) { bool found = false; for(int i = rnk; i < dp.size(); i++) { if(fabs(dp[i][j]) > EPS) { if(i != rnk) { swap(dp[i], dp[rnk]); } found = true; break; } } assert(found); double scale = dp[rnk][j]; for(int a = 0; a < dp[rnk].size(); a++) dp[rnk][a] /= scale; for(int x = 0; x <= amt; x++) { if(x == rnk) continue; double scale = -dp[x][j]; for(int y = 0; y < dp[x].size(); y++) dp[x][y] += scale * dp[rnk][y]; } rnk++; } assert(rnk == amt+1); return rrefdp[key] = dp[src].back(); }; int n; cin >> n; vector p(n); for(auto& x: p) cin >> x; vector target(n); for(auto& x: target) cin >> x; vector dp(1 << n); for(int mask = 0; mask < (1<