// In the name of God

#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <deque>
#include <assert.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <stdio.h>
#include <string.h>
#include <utility>
#include <math.h>
#include <bitset>
#include <iomanip>
#include <complex>

using namespace std;

#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()

template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
template<typename T> inline bool smin(T &a, const T &b)   { return a > b ? a = b : a;    }
template<typename T> inline bool smax(T &a, const T &b)   { return a < b ? a = b : a;    }

typedef long long LL;

const int N = (int) 405, mod = (int) 1e9 + 7;
int fact[N], f[N], g[N], a[N], b[N], dp[N][N], ha[N][N], hb[N][N], dif[N][N];
pair<int, int> nxt[N][N];
void sadd(int &x, int y) {
	x += y;
	while (x >= mod) x -= mod;
	while (x < 0) x += mod;
}
int main() {
	fact[0] = 1;
	for (int j = 1; j < N; ++j) fact[j] = fact[j - 1] * (LL) j % mod;
	int m, n;
	cin >> m;
	n = m / 3;
	for (int j = 0; j < m; ++j) cin >> a[j], --a[j];
	for (int j = 0; j < m; ++j) cin >> b[j], --b[j];
	for (int j = 0; j < m; ++j) {
		memcpy(ha[j + 1], ha[j], sizeof ha[j]);
		memcpy(hb[j + 1], hb[j], sizeof hb[j]);
		ha[j + 1][a[j]] = 1;
		hb[j + 1][b[j]] = 1;
	}
	nxt[m][m] = mp(m, m);
	for (int x = m; x >= 0; --x) {
		for (int y = m; y >= 0; --y) {
			if (x == m || y == m) {
				nxt[x][y] = mp(m, m);	
			} else {
				if (!hb[y][a[x]] && !ha[x][b[y]]) {
					nxt[x][y] = mp(x, y);
				} else if (hb[y][a[x]]) {
					nxt[x][y] = nxt[x + 1][y];	
				} else {
					nxt[x][y] = nxt[x][y + 1];	
				}
			}
			for (int p = 0; p < m; ++p) {
				if (ha[x][p] || hb[y][p]) {
					++dif[x][y];	
				}
			}
		}
	}
	dp[0][0] = 1;
	for (int step = 0; step < n + 1; ++step) {
		for (int x = 0; x < m; ++x) {
			for (int y = 0; y < m; ++y) {
				if (nxt[x][y] == mp(x, y)) {
					int rem = step - (dif[x][y] - step - step);
					if (rem < 0 || rem > step) continue;
					int nx = nxt[x + 1][y].first, ny = nxt[x + 1][y].second;
					sadd(dp[nx][ny], dp[x][y] * (LL) rem % mod);
				}
			}
		}
//		for (int x = m; x >= 1; --x) {
//			for (int y = m; y >= 1; --y) {
//								cout << step << " hi " << x - 1 << ' ' << y - 1 << ' ' << dp[x - 1][y - 1] << endl;
				/*				cout << step << " hi " << x << ' ' << y << ' ' << dp[x][y] << ' ' << a[x - 1] << ' ' << b[y - 1] << ' ' << dp[x - 1][y - 1] << ' ' << (a[x - 1] != (b[y - 1])) << endl;
				 */
//			}
//		}
		for (int x = 0; x < m; ++x) {
			for (int y = 0; y < m; ++y) {
				if (nxt[x][y] == mp(x, y) && a[x] != b[y]) {
					int rem = step - (dif[x][y] - step - step);
					if (rem < 0 || rem > step) continue;
					int nx = nxt[x][y + 1].first, ny = nxt[x][y + 1].second;
					sadd(dp[nx][ny], dp[x][y] * (LL) rem % mod);
				}
			}
		}
		if (step != n) {
			for (int x = m; x >= 1; --x) {
				for (int y = m; y >= 1; --y) {
					int nx = nxt[x][y].first, ny = nxt[x][y].second;
			//		cout << step << " hi " << x - 1 << ' ' << y - 1 << ' ' << dp[x - 1][y - 1] << endl;
					sadd(dp[nx][ny], dp[x - 1][y - 1] * (a[x - 1] != b[y - 1]));	
	//				if (dp[x - 1][y - 1] * (a[x - 1] != b[y - 1])) {
	//					cout << ' ' << step <<  " hi " << x - 1 << ' ' << y - 1 << ' ' << nx << ' ' << ny << ' ' << dp[x - 1][y - 1] << endl;	
	//				}
					dp[x - 1][y - 1] = 0;
				}
			}
		}
	}
	int res = dp[m][m];
	for (int j = 0; j < n; ++j) {
		res = (LL) res * (j * 3 + 1) % mod;
		res = (LL) res * (j * 3 + 2) % mod;
	}
	cout << res << endl;

}






Measured memory_bytes: 4096