#include using namespace std; int N; vector> P; vector Q; vector used; // 順列生成 void Permutation(int &ways, int depth) { // 順列集計 if(depth == N) { for(int i = 0; i < N; i++) P[ways][i] = Q[i]; ways++; } // 順列要素作成 else { for(int i = 0; i < N; i++) { if(!used[i]) { Q[depth] = i; used[i] = true; Permutation(ways, depth+1); used[i] = false; } } } } int main() { // 諸元入力 cin >> N; // 順列諸元 int Nf = 1, ways = 0; for(int i = 1; i <= N; i++) Nf *= i; // Nの階乗 P.assign(Nf, vector(N)); Q.resize(N); used.assign(N, 0); // 順列作成 Permutation(ways, 0); // カード諸元 vector A(N), B(N); for(int i = 0; i < N; i++) cin >> A[i]; for(int i = 0; i < N; i++) cin >> B[i]; // 総当たり勝敗 double tmp = 0; for(int i = 0; i < Nf; i++) { for(int j = 0; j < Nf; j++) { int a = 0, b = 0; for(int k = 0; k < N; k++) { A[P[i][k]] > B[P[j][k]] ? a++: b++; } if(a > b) tmp++; } } // 結果集計 double res = tmp / (Nf * Nf); // 結果出力 cout << res << endl; }