#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int pri[N],pcnt;
bool visp[100005];
int f[N][N],n;
void initprime() {
for (int i = 2;pcnt<500;i++)
{
if (!visp[i]) pri[++pcnt] = i;
for (int j = 2;i*j < 1e5;j++)
visp[i*j] = true;
}
}
struct Edge {
int nxt,to;
};
struct Tree {
int head[N],tot;
Edge e[N<<1];
void init() {
memset(head,0,sizeof(head));
tot = 0;
}
void add(int x,int y) {
e[++tot].nxt = head[x];head[x] = tot;e[tot].to = y;
e[++tot].nxt = head[y];head[y] = tot;e[tot].to = x;
}
unsigned int thash[N];
int size[N],thei[N],fa[N];
void dfs(int x,int f) {
fa[x] = f;
thash[x] = 1;
thei[x] = 1;
size[x] = 1;
for (int i = head[x];i;i=e[i].nxt)if(e[i].to!=fa[x]) {
dfs(e[i].to,x);
thei[x] = max(thei[x],thei[e[i].to]+1);
thash[x] += thash[e[i].to]*pri[size[e[i].to]];
size[x]+=size[e[i].to];
}
}
}t1,t2;
bool cmp(const int &a,const int &b) {
return t1.thei[a] < t1.thei[b];
}
int id[N];
struct Max_Flow{
int head[N<<1],last[N<<1],pre[N<<1],vis[N<<1],dis[N<<1],flow[N<<1],s,t,tot;
struct edge {int u,v,w,c,nxt;}es[502010];
void addedge(int u,int v,int w,int c)
{
es[++tot] = (edge){u,v,w,c,head[u]};
head[u] = tot;
}
void add(int u,int v,int w,int c) {addedge(u,v,w,c);addedge(v,u,0,-c);}
void init(int mx) {
for (int i = 0;i <= mx+1;i++)head[i] = -1;
tot = -1;
s = 0,t = mx+1;
}
bool spfa(int mx)
{
for (int i = 0;i<= mx+1;i++)dis[i] = flow[i] = 0x3f3f3f3f,vis[i] = 0;
queue<int> q;q.push(s);
vis[s] = 1,dis[s] = 0,pre[t] = -1;
while(!q.empty()){
int u = q.front();q.pop();
vis[u] = 0;
for(int i=head[u];~i;i=es[i].nxt){
int v = es[i].v,w = es[i].w,c = es[i].c;
if(w>0 && dis[v] > dis[u] + c){
dis[v] = dis[u] + c;
pre[v] = u;
last[v] = i;
flow[v] = min(flow[u],w);
if(!vis[v]){
vis[v] = 1;
q.push(v);
}
}
}
}
return ~pre[t];
}
pair<int,int> MCMF(int mx)
{
pair<int,int> res = make_pair(0,0);
while(spfa(mx)){
int now = t;
res.first += flow[t];
res.second += flow[t] * dis[t];
while(now != s){
es[last[now]].w -= flow[t];
es[last[now]^1].w += flow[t];
now = pre[now];
}
}
return res;
}
}mcmf;
void calc(int x,int y) {
vector<int>sonx,sony;
sonx.clear();sony.clear();
for (int i = t1.head[x];i;i=t1.e[i].nxt) if (t1.e[i].to!=t1.fa[x]) {
sonx.push_back(t1.e[i].to);
}
for (int i = t2.head[y];i;i=t2.e[i].nxt) if (t2.e[i].to!=t2.fa[y]) {
sony.push_back(t2.e[i].to);
}
mcmf.init(sonx.size()+sony.size());
for (int i = 0;i < sonx.size();i++)
for (int j = 0;j < sony.size();j++) {
int sx = sonx[i],sy = sony[j];
if (f[sx][sy]!=-1) {
mcmf.add(i+1,j+1+sonx.size(),1,f[sx][sy]);
}
}
for (int i = 0;i < sonx.size();i++) mcmf.add(0,i+1,1,0);
for (int i = 0;i < sony.size();i++) mcmf.add(i+1+sonx.size(),sonx.size()+sony.size()+1,1,0);
f[x][y] = (x!=y) + mcmf.MCMF(sonx.size()+sony.size()).second;
}
int main() {
int x;
scanf("%d",&n);
t1.init();
t2.init();
initprime();
int root1=1,root2=1;
for (int i = 1;i<= n;i++) {
scanf("%d",&x);
if (x!=0)t1.add(x,i);
else root1 = i;
}
for (int i = 1;i<= n;i++) {
scanf("%d",&x);
if (x!=0)t2.add(x,i);
else root2 = i;
id[i] = i;
}
t1.dfs(root1,0);
t2.dfs(root2,0);
sort(id+1,id+n+1,cmp);
for (int i = 1;i<= n;i++)
for (int j = 1;j<= n;j++)
{
if (t1.thei[i]==1 && t2.thei[j]==1)
f[i][j] = (i!=j);
else f[i][j] = -1;
}
for (int i = 1;i<= n;i++)
{
int x = id[i];
if (t1.thei[x]!=1)
for (int j = 1;j<= n;j++) {
int y = j;
if (t2.thei[y] == t1.thei[x] && t1.thash[x] == t2.thash[y])
calc(x,y);
}
}
printf("%d\n",f[root1][root2]);
return 0;
}