//.at(i)を[i]と書いても警告が出るように #ifndef ONLINE_JUDGE #define _GLIBCXX_DEBUG #endif #include using namespace std; //all マクロ #define all(v) (v).begin(), (v).end() //ループマクロ #define re(n) for (int64_t re_i = 0; re_i < int64_t(n); re_i++) #define rep(i, n) for (int64_t i = 0; i < int64_t(n); i++) #define repp(i, n) for (int64_t i = 0; i <= int64_t(n); i++) #define rrep(i, a, b) for (int64_t i = a; i < int64_t(b); i++) #define per(i, n) for (int64_t i = int64_t(n) - 1; i >= 0; i--) //sizeをint64_t型に #define sz(x) ((int64_t)x.size()) #define pb push_back #define pob pop_back #define mp make_pair #define fi first #define se second //int64_t using lint = int64_t; //long double using ld = long double; //ベクター template using vc = vector; template using vv = vector>; template using vvv = vector>>; template using vvvv = vector>>>; //ペア using pll = pair; //プライオリティーキュー template using pq = priority_queue>; // 大きい順 template using pqg = priority_queue, greater>; // 小さい順 //cin cout オーバーロード //vector template istream &operator>>(istream &is, vector &v) { for (T & in : v) is >> in; return is; } template ostream &operator<<(ostream & os, const vector &v) { for (int64_t i = 0; i < (int64_t)v.size(); i++) { os << v[i] << (i + 1 != (int64_t)v.size() ? " " : ""); } return os; } template ostream &operator<<(ostream &os, const vector> &v) { for (int64_t i = 0; i < (int64_t)v.size(); i++) { os << v[i] << endl; } return os; } template ostream &operator<<(ostream &os, const vector>> &v) { for (int64_t i = 0; i < (int64_t)v.size(); i++) { os << "i = " << i << endl; os << v[i]; } return os; } //pair template istream &operator>>(istream &is, pair &p) { is >> p.first >> p.second; return is; } template ostream &operator<<(ostream & os, const pair & p) { os << "(" << p.first << "," << p.second << ")"; return os; } //Yes No出力 #define YES cout << "YES" << endl; #define Yes cout << "Yes" << endl; #define NO cout << "NO" << endl; #define No cout << "No" << endl; #define dame cout << -1 << endl; void YN (bool b) { if (b) cout << "YES" << endl; else cout << "NO" << endl; return; } void yn (bool b) { if (b) cout << "Yes" << endl; else cout << "No" << endl; return; } // 値の更新 template bool chmax(T1 &x, const T2 &y) { bool compare = x < y; if (compare) x = y; return compare; } template bool chmin(T1 &x, T2 y) { bool compare = x > y; if (compare) x = y; return compare; } //next_permutation #define next_p(v) next_permutation((v).begin(), (v).end()) //小数の桁 #define dlfix(n) cout << fixed << setprecision(n); //無限 int64_t inf = 1001001001; int64_t INF = 1001001001001001001; //モッド int64_t MOD = 998244353; //パイ long double pi = 3.14159265358979323846264338327950; //ネイピア数 long double e = 2.718281828459045235360287471352; //移動 vector dh = {1, 0, -1, 0}; vector dw = {0, 1, 0, -1}; vector ddh = {1, 1, 0, -1, -1, -1, 0, 1}; vector ddw = {0, 1, 1, 1, 0, -1, -1, -1}; //範囲内チェック #define in_grid(h, w, H, W) if (!(0 <= h && 0 <= w && h < H && w < W)) continue; //上下反転 void UDflip (vector> &v) { reverse(v.begin(), v.end()); return; } //左右反転 void LRflip (vector> &v) { for (auto &x : v) { reverse(x.begin(), x.end()); } return; } //nPr int64_t nPr (int64_t n, int64_t r) { int64_t Ans = 1; for (int64_t i = 0; i < r; i++) { Ans *= n - i; } return Ans; } //nCr vector> nCr_memo; int64_t nCr (int64_t n, int64_t r) { if (n < r) { cout << "Error nCrのrがnより大きいです" << endl; return 0; } for (int64_t i = (int64_t)nCr_memo.size(); i <= n; i++) { nCr_memo.push_back(vector(i + 1, 1)); for (int64_t j = 1; j < i; j++) { nCr_memo[i][j] = nCr_memo[i - 1][j - 1] + nCr_memo[i - 1][j]; } } return nCr_memo[n][r]; } //経過時間 long double Time () { return 1.0 * (clock()) / CLOCKS_PER_SEC; } /*----------------------------------------------------------*/ //小さい順 template void Vsort (vector &v) { sort(v.begin(), v.end()); return; } //大きい順 template void Vsortg (vector &v) { sort(v.rbegin(), v.rend()); return; } //リバース template void Vreverse (vector &v) { reverse(v.begin(), v.end()); return; } //重複の削除 template void Vunique (vector &v) { v.erase(unique(v.begin(), v.end()), v.end()); return; } //リストの移動 void Vrotate (vector &v, int64_t n) { if (v.empty()) return; n %= v.size(); rotate(v.begin(), v.begin() + n, v.end()); return; } //累乗 int64_t power (int64_t a, int64_t b) { int64_t Ans = 1; while (b > 0) { if (b & 1) Ans *= a; a *= a; b >>= 1; } return Ans; } //階乗 int64_t factorial(int64_t n) { int64_t Ans = 1; for (int64_t i = 1; i <= n; i++) Ans *= i; return Ans; } //2次元距離 double distan (int64_t x1, int64_t y1, int64_t x2, int64_t y2) { return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } //2次元距離の2乗 int64_t distan2 (int64_t x1, int64_t y1, int64_t x2, int64_t y2) { return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); } //数値のN桁目 int64_t digit(int64_t x, int64_t k) { while (k--) x /= 10; return x % 10; } //---------------------------------------------------------- //二分探索 template int64_t binarch(int64_t ok, int64_t ng, Func F) { while (llabs(ok - ng) > 1) { int64_t mid = ok + (ng - ok) / 2; if (F(mid)) ok = mid; else ng = mid; } return ok; } // Union-Find struct unionfind { vector par, rank, siz; // 初期化(コンストラクタ) unionfind(int64_t n) { par = vector(n); for (int i = 0; i < n; i++) par[i] = i; rank = vector(n, 0); siz = vector(n, 1); } //根(親)を探す int64_t find(int64_t x) { if (par[x] == x) return x; else return par[x] = find(par[x]); } // x と y が同じグループであるか bool same(int64_t x, int64_t y) { return find(x) == find(y); } // x と y を同じグループにする bool unite(int64_t x, int64_t y) { int64_t px = find(x), py = find(y); if (px == py) return false; if (rank[px] < rank[py]) swap(px, py); par[py] = px; if (rank[px] == rank[py]) rank[px]++; siz[px] += siz[py]; return true; } // サイズを求める int64_t size(int64_t x) { return siz[find(x)]; } }; int64_t farthest (int64_t N, int64_t u, vector> adj) { queue Q; Q.push(u); vector D(N, -1); D[u] = 0; while (Q.size()) { int64_t u = Q.front(); Q.pop(); for (auto v : adj[u]) { if (D[v] != -1) continue; D[v] = D[u] + 1; Q.push(v); } } int64_t Max = 0, ans = -1; for (int64_t i = 0; i < N; i++) { if (D[i] > Max) { Max = D[i]; ans = i; } } return ans; } int64_t farthest_d (int64_t N, int64_t u, vector> adj) { queue Q; Q.push(u); vector D(N, -1); D[u] = 0; while (Q.size()) { int64_t u = Q.front(); Q.pop(); for (auto v : adj[u]) { if (D[v] != -1) continue; D[v] = D[u] + 1; Q.push(v); } } sort(D.begin(), D.end()); return D[N - 1]; } /*----------------------------------------------------------*/ void solve () { lint N; cin >> N; vc A(N), B(N); cin >> A >> B; lint C = 0; Vsort(A); Vsort(B); do { lint c = 0; rep (i, N) { if (A[i] > B[i]) { c++; } } if (c > N / 2) C++; } while (next_p(A)); dlfix(20); cout << 1.0 * C / factorial(N) << endl; return; } int main () { solve(); }