Problem: 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.

Examples

Input

3
1 2 3
2 3 1


Output

2


Input

3
1 2 3
1 2 3


Output

0


Input

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


Output

80


Input

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


Output

160


Input

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


Output

33600

Solution (in CPP):

Solution:
//by yjz
#include<bits/stdc++.h>
using namespace std;
#define FF first
#define SS second
#define PB push_back
#define MP make_pair
#define bged(v) (v).begin(),(v).end()
#define foreach(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++)
typedef long long ll;
const int Imx=2147483647;
const ll Lbig=2e18;
const int mod=1e9+7;
//My i/o stream
struct fastio
{
	char s[100000];
	int it,len;
	fastio(){it=len=0;}
	inline char get()
	{
		if(it<len)return s[it++];it=0;
		len=fread(s,1,100000,stdin);
		if(len==0)return EOF;else return s[it++];
	}
	bool notend()
	{
		char c=get();
		while(c==' '||c=='\n')c=get();
		if(it>0)it--;
		return c!=EOF;
	}
}_buff;
#define geti(x) x=getnum()
#define getii(x,y) geti(x),geti(y)
#define getiii(x,y,z) getii(x,y),geti(z)
#define puti(x) putnum(x),putchar(' ')
#define putii(x,y) puti(x),puti(y)
#define putiii(x,y,z) putii(x,y),puti(z)
#define putsi(x) putnum(x),putchar('\n')
#define putsii(x,y) puti(x),putsi(y)
#define putsiii(x,y,z) putii(x,y),putsi(z)
inline ll getnum()
{
	ll r=0;bool ng=0;char c;c=_buff.get();
	while(c!='-'&&(c<'0'||c>'9'))c=_buff.get();
	if(c=='-')ng=1,c=_buff.get();
	while(c>='0'&&c<='9')r=r*10+c-'0',c=_buff.get();
	return ng?-r:r;
}
template<class T> inline void putnum(T x)
{
	if(x<0)putchar('-'),x=-x;
	register short a[20]={},sz=0;
	while(x)a[sz++]=x%10,x/=10;
	if(sz==0)putchar('0');
	for(int i=sz-1;i>=0;i--)putchar('0'+a[i]);
}
inline char getreal(){char c=_buff.get();while(c==' '||c=='\n')c=_buff.get();return c;}
int n,a[411],b[411],ia[411],ib[411];
ll dp[411][411][155];
ll tdp[411][411][155];
ll f[411][411];
int cnt[411][411];
pair<int,int> nxt[411][411];
void add(int x,int y,int z,ll v)
{
	if(x>n||y>n)return;
	pair<int,int> p=nxt[x][y];
	x=p.FF;y=p.SS;
	dp[x][y][z]+=v;
}
void tadd(int x,int y,int z,ll v)
{
//	cerr<<"tadd:"<<x<<","<<y<<","<<z<<" "<<v<<endl;
	if(x>n||y>n)return;
	pair<int,int> p=nxt[x][y];
	x=p.FF;y=p.SS;
	tdp[x][y][z]+=v;
}

int main()
{
	geti(n);
	for(int i=1;i<=n;i++)geti(a[i]),ia[a[i]]=i;
	for(int i=1;i<=n;i++)geti(b[i]),ib[b[i]]=i;
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			cnt[i][j]=i+j;
			for(int k=1;k<=i;k++)
			{
				if(ib[a[k]]<=j)
				{
					cnt[i][j]--;
				}
			}
		}
	}
	for(int i=n;i>=1;i--)
	{
		for(int j=n;j>=1;j--)
		{
			nxt[i][j]=MP(i,j);
			if(i<n&&cnt[i+1][j]==cnt[i][j])nxt[i][j]=nxt[i+1][j];
			if(j<n&&cnt[i][j+1]==cnt[i][j])nxt[i][j]=nxt[i][j+1];
		}
	}
	f[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n/3;j++)
		{
			f[i][j]=f[i-1][j-1];
			if(j*3>=i)f[i][j]=(f[i][j]+f[i-1][j]*(j*3-i+1))%mod;
		}
	}
	ll coef=f[n][n/3];
//	cerr<<coef<<endl;
	dp[0][0][0]=1;
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(nxt[i][j]!=MP(i,j))continue;
			for(int k=0;k<=n/3;k++)
			{
				ll &cur=dp[i][j][k];
				ll &tcur=tdp[i][j][k];
				tcur%=mod;
				cur=(cur+tcur)%mod;
				if(!cur&&!tcur)continue;
				int id=(cnt[i][j]-k)/2;
//				cerr<<i<<" "<<j<<" "<<k<<" "<<cur<<" "<<tcur<<" cnt="<<cnt[i][j]<<endl;
				if(k<id)
				{
					add(i+1,j,k+1,(cur-tcur+mod)*(id-k)%mod);
					if(b[j+1]!=a[i+1])
					{
						tadd(i,j+1,k+1,cur*(id-k)%mod);
					}
				}
				if(a[i+1]!=b[j+1]&&i<n&&j<n)
				{
					add(i+1,j+1,k,cur);
				}
			}
		}
	}
	cout<<dp[n][n][n/3]*coef%mod;
	return 0;
}