Problem:
Score : 300 points

Problem Statement

We have two permutations P and Q of size N (that is, P and Q are both rearrangements of (1,~2,~...,~N)).

There are N! possible permutations of size N. Among them, let P and Q be the a-th and b-th lexicographically smallest permutations, respectively. Find |a - b|.

Notes

For two sequences X and Y, X is said to be lexicographically smaller than Y if and only if there exists an integer k such that X_i = Y_i~(1 \leq i < k) and X_k < Y_k.

Constraints

2 \leq N \leq 8

P and Q are permutations of size N.

Input

Input is given from Standard Input in the following format:

N
P_1 P_2 ... P_N
Q_1 Q_2 ... Q_N

Output

Print |a - b|.

Sample Input 1

3
1 3 2
3 1 2

Sample Output 1

3

There are 6 permutations of size 3: (1,~2,~3), (1,~3,~2), (2,~1,~3), (2,~3,~1), (3,~1,~2), and (3,~2,~1). Among them, (1,~3,~2) and (3,~1,~2) come 2-nd and 5-th in lexicographical order, so the answer is |2 - 5| = 3.

Sample Input 2

8
7 3 5 4 2 1 6 8
3 8 2 5 4 6 7 1

Sample Output 2

17517

Sample Input 3

3
1 2 3
1 2 3

Sample Output 3

0

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class C
{
    static void Main()
    {
        
        int N = int.Parse(Console.ReadLine().Trim());
        int[] P = Console.ReadLine().Trim().Split(' ').Select(int.Parse).ToArray();
        int[] Q = Console.ReadLine().Trim().Split(' ').Select(int.Parse).ToArray();

        var answer = Narabikae(N, P, Q);
        Console.WriteLine(answer.ToString());
    }

    private static int Narabikae(int N, int[] P, int[] Q)
    {
        string narabi = string.Empty;
        int count = 0;
        int Prank = 0;
        int Qrank = 0;

        var Pline = string.Empty;
        var Qline = string.Empty;
        for (int i = 0; i < P.Count(); i++)
        {
            if (string.IsNullOrEmpty(Pline))
            {
                Pline = P[i].ToString();
            }
            else
            {
                Pline += P[i].ToString();
            }
        }
        for (int i = 0; i < Q.Count(); i++)
        {
            if (string.IsNullOrEmpty(Qline))
            {
                Qline = Q[i].ToString();
            }
            else
            {
                Qline += Q[i].ToString();
            }
        }

        for (int a = 1; a <= N; a++)
        {
            //2桁目
            if (N - 1 == 0) continue;
            for (int b = 1; b <= N; b++)
            {
                if (a == b) continue;
                if (N == 2)
                {
                    narabi = a.ToString() + b.ToString();
                    count++;
                    if (narabi == Pline) Prank = count;
                    if (narabi == Qline) Qrank = count;
                }

                //3桁目
                if (N - 2 == 0) continue;
                for (int c = 1; c <= N; c++)
                {
                    if (a == c || b == c) continue;
                    if (N == 3)
                    {
                        narabi = a.ToString() + b.ToString() + c.ToString();
                        count++;
                        if (narabi == Pline) Prank = count;
                        if (narabi == Qline) Qrank = count;
                    }

                    //4桁目
                    if (N - 3 == 0) continue;
                    for (int d = 1; d <= N; d++)
                    {
                        if (a == d || b == d || c == d) continue;
                        if (N == 4)
                        {
                            narabi = a.ToString() + b.ToString() + c.ToString() + d.ToString();
                            count++;
                            if (narabi == Pline) Prank = count;
                            if (narabi == Qline) Qrank = count;
                        }

                        //5桁目
                        if (N - 4 == 0) continue;
                        for (int e = 1; e <= N; e++)
                        {
                            if (a == e || b == e || c == e || d == e) continue;
                            if (N == 5)
                            {
                                narabi = a.ToString() + b.ToString() + c.ToString() + d.ToString() + e.ToString();
                                count++;
                                if (narabi == Pline) Prank = count;
                                if (narabi == Qline) Qrank = count;
                            }

                            //6桁目
                            if (N - 5 == 0) continue;
                            for (int f = 1; f <= N; f++)
                            {
                                if (a == f || b == f || c == f || d == f || e == f) continue;
                                if (N == 6)
                                {
                                    narabi = a.ToString() + b.ToString() + c.ToString() + d.ToString() + e.ToString() + f.ToString();
                                    count++;
                                    if (narabi == Pline) Prank = count;
                                    if (narabi == Qline) Qrank = count;
                                }

                                //7桁目
                                if (N - 6 == 0) continue;
                                for (int g = 1; g <= N; g++)
                                {
                                    if (a == g || b == g || c == g || d == g || e == g || f == g) continue;
                                    if (N == 7)
                                    {
                                        narabi = a.ToString() + b.ToString() + c.ToString() + d.ToString() + e.ToString() + f.ToString() + g.ToString();
                                        count++;
                                        if (narabi == Pline) Prank = count;
                                        if (narabi == Qline) Qrank = count;
                                    }

                                    //8桁目
                                    if (N - 7 == 0) continue;
                                    for (int h = 1; h <= N; h++)
                                    {
                                        if (a == h || b == h || c == h || d == h || e == h || f == h || g == h) continue;
                                        if (N == 8)
                                        {
                                            narabi = a.ToString() + b.ToString() + c.ToString() + d.ToString() + e.ToString() + f.ToString() + g.ToString() + h.ToString();
                                            count++;
                                            if (narabi == Pline) Prank = count;
                                            if (narabi == Qline) Qrank = count;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        return Prank > Qrank ? Prank - Qrank : Qrank - Prank;

    }
}