const int MAXN=3005,MAXM=60005,Inf=0x7fffffff;
struct Edge{
int to,cap,next;
Edge(int to=0,int cap=0,int next=0){
this->to=to;
this->cap=cap;
this->next=next;
}
}edge[MAXM<<1];
int head[MAXN],edge_cnt;
void Clear(){mem(head,-1);edge_cnt=0;}//边从0开始编号
void Insert(int u,int v,int c){
edge[edge_cnt]=Edge(v,c,head[u]);
head[u]=edge_cnt++;
edge[edge_cnt]=Edge(u,0,head[v]);
head[v]=edge_cnt++;
}
struct Dinic{
int s,t;
int pos[MAXN],vis[MAXN],dis[MAXN];
bool bfs(int k){
queue<int>q;
q.push(s);
vis[s]=k,dis[s]=0,pos[s]=head[s];
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(vis[v]!=k&&edge[i].cap){
vis[v]=k,dis[v]=dis[u]+1,pos[v]=head[v];
q.push(v);
if(v==t)
return true;
}
}
}
return false;
}
int dfs(int u,int max_flow){
if(u==t||!max_flow)
return max_flow;
int flow=0,temp_flow;
for(int &i=pos[u];~i;i=edge[i].next){
int v=edge[i].to;
if(dis[u]+1==dis[v]&&(temp_flow=dfs(v,min(max_flow,edge[i].cap)))){
edge[i].cap-=temp_flow;
edge[i^1].cap+=temp_flow;
flow+=temp_flow;
max_flow-=temp_flow;
if(!max_flow)
break;
}
}
return flow;
}
int Maxflow(int s,int t){
this->s=s;this->t=t;
int ans=0,k=0;
mem(vis,0);
while(bfs(++k))
ans+=dfs(s,Inf);
return ans;
}
}solver;
const int MAXV=105;
int a[MAXN],b[MAXN],last[MAXV];
int main()
{
int n=read_int(),s=0,t=n+1,ans=0;
Clear();
_rep(i,1,n)
a[i]=read_int();
_rep(i,1,n){
b[i]=read_int();
if(b[i]>0)
Insert(s,i,b[i]),ans+=b[i];
else if(b[i]<0)
Insert(i,t,-b[i]);
}
_rep(i,1,n){
_for(j,1,MAXV){
if(a[i]%j==0&&last[j])
Insert(i,last[j],Inf);
}
last[a[i]]=i;
}
enter(ans-solver.Maxflow(s,t));
return 0;
}