Problem:
Score : 1800 points

Problem Statement

Three men, A, B and C, are eating sushi together.
Initially, there are N pieces of sushi, numbered 1 through N.
Here, N is a multiple of 3.

Each of the three has likes and dislikes in sushi.
A's preference is represented by (a_1,\ ...,\ a_N), a permutation of integers from 1 to N.
For each i (1 \leq i \leq N), A's i-th favorite sushi is Sushi a_i.
Similarly, B's and C's preferences are represented by (b_1,\ ...,\ b_N) and (c_1,\ ...,\ c_N), permutations of integers from 1 to N.

The three repeats the following action until all pieces of sushi are consumed or a fight brakes out (described later):

Each of the three A, B and C finds his most favorite piece of sushi among the remaining pieces. Let these pieces be Sushi x, y and z, respectively. If x, y and z are all different, A, B and C eats Sushi x, y and z, respectively. Otherwise, a fight brakes out.

You are given A's and B's preferences, (a_1,\ ...,\ a_N) and (b_1,\ ...,\ b_N).
How many preferences of C, (c_1,\ ...,\ c_N), leads to all the pieces of sushi being consumed without a fight?
Find the count modulo 10^9+7.

Constraints

3 \leq N \leq 399

N is a multiple of 3.

(a_1,\ ...,\ a_N) and (b_1,\ ...,\ b_N) are permutations of integers from 1 to N.

Input

Input is given from Standard Input in the following format:

N
a_1 ... a_N
b_1 ... b_N

Output

Print the number of the preferences of C that leads to all the pieces of sushi being consumed without a fight, modulo 10^9+7.

Sample Input 1

3
1 2 3
2 3 1

Sample Output 1

2

The answer is two, (c_1,\ c_2,\ c_3) = (3,\ 1,\ 2),\ (3,\ 2,\ 1).
In both cases, A, B and C will eat Sushi 1, 2 and 3, respectively, and there will be no more sushi.

Sample Input 2

3
1 2 3
1 2 3

Sample Output 2

0

Regardless of what permutation (c_1,\ c_2,\ c_3) is, A and B will try to eat Sushi 1, resulting in a fight.

Sample Input 3

6
1 2 3 4 5 6
2 1 4 3 6 5

Sample Output 3

80

For example, if (c_1,\ c_2,\ c_3,\ c_4,\ c_5,\ c_6) = (5,\ 1,\ 2,\ 6,\ 3,\ 4), A, B and C will first eat Sushi 1, 2 and 5, respectively, then they will eat Sushi 3, 4 and 6, respectively, and there will be no more sushi.

Sample Input 4

6
1 2 3 4 5 6
6 5 4 3 2 1

Sample Output 4

160

Sample Input 5

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

Sample Output 5

33600

Solution in Common Lisp (SBCL 1.1.14) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
 
using namespace std;
 
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
 
using ll = long long;
using ld = long double;
 
constexpr int nax = 405;
constexpr int infty = 1000 * 1000 * 1000 + 5;
constexpr int mod = 1000 * 1000 * 1000 + 7;
 
inline ll Dodaj(ll a, ll b) {
  a += b;
  if (a >= mod) a -= mod;
  return a;
}
 
inline ll Mnoz(ll a, ll b) {
  return (a * b) % mod;
}
 
int n;
int a[nax], b[nax];
ll sil[nax];
bitset<nax> zbiora[nax], zbiorb[nax];
 
ll Dp(int pa, int pb, int ps);
ll Dp_(int pa, int pb, int ps) {
  auto Or = zbiora[pa - 1] | zbiorb[pb - 1];
  const int or_size = Or.count();
  const int ht = or_size + ps;
  assert(ht % 3 == 0);
  const int y = n - (or_size + ps);
  if (ht == n) {
    assert(y == 0);
    return sil[ps];
  }
  assert(0 <= y and y <= n);
  const int c = a[pa];
  const int d = b[pb];
  if (zbiorb[pb - 1][c]) return Dp(pa + 1, pb, ps);
  if (zbiora[pa - 1][d]) return Dp(pa, pb + 1, ps);
  const ll wybor_1 = y - 1;
  const ll wybor_2 = Mnoz(y - 1, y - 2);
  debug() << imie(pa) imie(pb) imie(ps) imie(y) imie(ht) imie(or_size) imie(c) imie(d) imie(wybor_1) imie(wybor_2);
  ll wynik = 0;
  if (c != d) {
    wynik = Mnoz(Dp(pa + 1, pb + 1, ps + 1), wybor_2);
  }
  if (ps > 0) {
    if (c == d) {
      wynik = Dodaj(wynik, Mnoz(Dp(pa + 1, pb + 1, ps - 1), ps));
    } else {
      wynik = Dodaj(wynik, Mnoz(Dp(pa + 1, pb, ps - 1), ps));
      wynik = Dodaj(wynik, Mnoz(Dp(pa, pb + 1, ps - 1), ps));
    }
  }
  return wynik;
}
 
int Encode(int pa, int pb, int ps) {
  return pa | (pb << 9) | (ps << 18);
}
 
ll Dp(int pa, int pb, int ps) {
  static map<int, ll> m;
  const int e = Encode(pa, pb, ps);
  auto it = m.find(e);
  if (it == m.end()) {
    const ll res = Dp_(pa, pb, ps);
    debug() << "Dp(" imie(pa) imie(pb) imie(ps) ") = " << res;
    return m[e] = res;
  }
  return it->second;
}
 
int main() {
  sil[0] = 1;
  for (int i = 1; i < nax; i++) {
    sil[i] = Mnoz(sil[i - 1], i);
  }
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    zbiora[i] = zbiora[i - 1];
    zbiora[i][a[i]] = 1;
  }
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    zbiorb[i] = zbiorb[i - 1];
    zbiorb[i][b[i]] = 1;
  }
  cout << Dp(1, 1, 0) << endl;
  return 0;
}