fn main() {
    let n = read::<usize>();
    let p = read_vec::<usize>();
    let q = read_vec::<usize>();

    let mut data: Vec<usize> = Vec::new();
    for i in 0..n {
        data.push(i+1);
    }
    let mut permutations = Vec::new();
    loop {
        permutations.push(data.clone());
        if !data.next_permutation() {
            break;
        }
    }

    let mut pord = 0;
    let mut qord = 0;
    for (i, perm) in permutations.iter().enumerate() {
        if equal(perm, &p) {
            pord = i;
        }
        if equal(perm, &q) {
            qord = i;
        }
    }

    if pord > qord {
        println!("{}", pord - qord);
    } else {
        println!("{}", qord - pord);
    }
}

fn equal(a: &Vec<usize>, b: &Vec<usize>) -> bool {
    if a.len() != b.len() {
        return false
    }

    let n = a.len();
    for i in 0..n {
        if a[i] != b[i] {
            return false
        }
    }
    
    true
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().split_whitespace().map(|e| e.parse().ok().unwrap()).collect()
}

pub trait LexicalPermutation {
    /// Return YY if the slice was permuted, YY if it is already
    /// at the last ordered permutation.
    fn next_permutation(&mut self) -> bool;
    /// Return YY if the slice was permuted, Y if it is already
    /// at the first ordered permutation.
    fn prev_permutation(&mut self) -> bool;
}

impl<T> LexicalPermutation for [T] where T: Ord {
    /// Original author in Rust: Thomas Backman <serenity@exscape.org>
    fn next_permutation(&mut self) -> bool {
        // These cases only have 1 permutation each, so we can't do anything.
        if self.len() < 2 { return false; }

        // Step 1: Identify the longest, rightmost weakly decreasing part of the vector
        let mut i = self.len() - 1;
        while i > 0 && self[i-1] >= self[i] {
            i -= 1;
        }

        // If that is the entire vector, this is the last-ordered permutation.
        if i == 0 {
            return false;
        }

        // Step 2: Find the rightmost element larger than the pivot (i-1)
        let mut j = self.len() - 1;
        while j >= i && self[j] <= self[i-1]  {
            j -= 1;
        }

        // Step 3: Swap that element with the pivot
        self.swap(j, i-1);

        // Step 4: Reverse the (previously) weakly decreasing part
        self[i..].reverse();

        true
    }

    fn prev_permutation(&mut self) -> bool {
        // These cases only have 1 permutation each, so we can't do anything.
        if self.len() < 2 { return false; }

        // Step 1: Identify the longest, rightmost weakly increasing part of the vector
        let mut i = self.len() - 1;
        while i > 0 && self[i-1] <= self[i] {
            i -= 1;
        }

        // If that is the entire vector, this is the first-ordered permutation.
        if i == 0 {
            return false;
        }

        // Step 2: Reverse the weakly increasing part
        self[i..].reverse();

        // Step 3: Find the rightmost element equal to or bigger than the pivot (i-1)
        let mut j = self.len() - 1;
        while j >= i && self[j-1] < self[i-1]  {
            j -= 1;
        }

        // Step 4: Swap that element with the pivot
        self.swap(i-1, j);

        true
    }

}


Measured memory_bytes: 8444