#include <iostream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <string>
#include <algorithm>
#include <utility>
#define llint long long
//#define double long double
#define inf 1e18
#define eps 1e-12
#define rep(x, s, t) for(llint (x) = (s); (x) < (t); (x)++)
#define Rep(x, s, t) for(llint (x) = (s); (x) <= (t); (x)++)
#define chmin(x, y) (x) = min((x), (y))
#define chmax(x, y) (x) = max((x), (y))

using namespace std;
typedef pair<double, llint> P;

struct Matrix{
	int h, w;
	vector<llint> mat;
	Matrix(){
		h = w = 0;
	}
	Matrix(int h, int w){
		this->h = h, this->w = w;
		mat.resize(h*w);
	}
	llint& at(int i, int j){
		return mat[w*(i-1)+(j-1)];
	}
	static Matrix ident(int size){
		Matrix ret(size, size);
		for(int i = 1; i <= size; i++) ret.at(i, i) = 1;
		return ret;
	}
	Matrix operator*(Matrix& ope){
		Matrix ret(h, ope.w);
		for(int i = 1; i <= h; i++){
			for(int j = 1; j <= ope.w; j++){
				for(int k = 1; k <= w; k++){
					ret.at(i, j) += at(i, k) * ope.at(k, j);
				}
			}
		}
		return ret;
	}
	void print(){
		for(int i = 1; i <= h; i++){
			for(int j = 1; j <= w; j++){
				cout << at(i, j) << " ";
			}
			cout << endl;
		}
	}
};

llint n;
llint A[200005], B[200005];
double a[200005], b[200005];
double E[200005];

Matrix mat[200005], imat[200005];
Matrix mul[200005], imul[200005];
vector<P> vec;
double e[200005], d[200005];

double calc(llint p, double dec)
{
	llint r = lower_bound(vec.begin(), vec.end(), P(dec, -inf)) - vec.begin() - 1;
	if(r < 0) r = 0;
	
	llint q = vec[r].second;
	long double s = e[q], t = dec - d[q];
	double x = 2 * (s-t) + 2 * b[q] - e[q-1];
	if(q == p) return max(a[q], (double)(s-t));
	
	Matrix res = mul[p-1] * imul[q];
	if(q == 1) return res.at(1, 1)*x + res.at(1, 2)*max(a[q],(double)(s-t)) + res.at(1, 3);
	else return res.at(1, 1)*x + res.at(1, 2)*e[q] + res.at(1, 3);
}

int main(void)
{
	scanf("%lld", &n);
	for(int i = 0; i < n; i++) scanf("%lld", &A[i]); //cin >> A[i];
	for(int i = 0; i < n; i++) scanf("%lld", &B[i]); //cin >> B[i];
	
	llint p = 0;
	for(int i = 0; i < n; i++){
		if(A[p] < A[i]) p = i;
	}
	for(int i = 0; i <= n; i++) a[i] = A[(i+p)%n], b[i] = B[(i+p)%n];
	E[0] = a[0];
	
	for(int i = 1; i < n; i++){
		mat[i] = Matrix(3, 3);
		mat[i].at(1, 1) = 2, mat[i].at(1, 2) = -1;
		mat[i].at(2, 1) = 1, mat[i].at(3, 3) = 1;
		mat[i].at(1, 3) = 2*b[i];
	}
	for(int i = 1; i < n; i++){
		imat[i] = Matrix(3, 3);
		imat[i].at(1, 2) = 1, imat[i].at(2, 1) = -1;
		imat[i].at(2, 2) = 2, imat[i].at(2, 3) = 2*b[i];
		imat[i].at(3, 3) = 1;
	}
	
	mul[0] = Matrix::ident(3);
	for(int i = 1; i < n; i++) mul[i] = mat[i] * mul[i-1];
	
	imul[0] = Matrix::ident(3);
	for(int i = 1; i < n; i++) imul[i] = imul[i-1] * imat[i];
	
	vec.push_back(P(0, 1));
	e[0] = e[1] = a[0], d[1] = 0;
	for(int i = 2; i <= n; i++){
		double ub = 1e18, lb = 0, mid;
		for(int j = 0; j < 100; j++){
			mid = (ub+lb)/2;
			//if(i == 71249) printf("%.11f %.11f\n", mid, calc(i, mid));
			if(calc(i, mid) <= a[i]) ub = mid;
			else lb = mid;
		}
		d[i] = ub;
		while(vec.size() && vec.back().first > d[i]) vec.pop_back();
		e[i] = calc(i, d[i]), e[i-1] = max(e[i-1], calc(i-1, d[i]));
		vec.push_back(P(d[i], i));
	}
	
	double dec = d[n], mn = inf;
	for(int i = n-1; i >= 1; i--){
		if(i > 1) mn = min(mn, d[i]);
		E[i] = max(a[i], calc(i, min(dec, mn)));
	}
	
	double ans = 0;
	for(int i = 0; i < n; i++) ans += E[i];
	ans /= n;
	printf("%.30f\n", ans);
	
	return 0;
}

Measured memory_bytes: 103996