#include <bits/stdc++.h>
typedef long long ll;
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a) FOR(i,0,a)
	
using namespace std;

const int MAX_N=100;
const ll INF=1e16;
int N;
struct edge{
	int to;
	ll cap;
	int rev;
	edge(int t=-1,ll c=0,int r=-1):to(t),cap(c),rev(r){}
};

vector<edge> G[MAX_N+2];

void add_edge(int s,int t,ll c){
	G[s].push_back(edge(t,c,G[t].size()));
	G[t].push_back(edge(s,0,(int)G[s].size()-1));
}
int ite[MAX_N+2],lev[MAX_N+2],prevv[MAX_N+2],pree[MAX_N+2];
void bfs(){
	memset(lev,-1,sizeof(lev));
	lev[0]=0;
	queue<int> que;
	que.push(0);
	while(!que.empty()){
		int v=que.front();
		que.pop();
		for(auto e:G[v]){
			if (lev[e.to]==-1 && e.cap>0){
				lev[e.to]=lev[v]+1;
				que.push(e.to);
			}
		}
	}
}
ll dfs(int v){
	if (v==1){
		return INF;
	}
	for(int &i=ite[v];i<(int)G[v].size();i++){
		edge e=G[v][i];
		if (lev[v]+1==lev[e.to] && e.cap>0){
			ll f=dfs(e.to);
			if (f!=0){
				prevv[e.to]=v;
				pree[e.to]=i;
				return min(f,e.cap);
			}
		}
	}
	return 0;
}
ll mxflow(){
	ll fl=0;
	for(;;){
		bfs();
		if (lev[1]==-1){
			break;
		}
		memset(ite,0,sizeof(ite));
		for(;;){
			ll f=dfs(0);
			if (f==0){
				break;
			}else{
				fl+=f;
				for(int v=1;v!=0;v=prevv[v]){
					G[prevv[v]][pree[v]].cap-=f;
					G[v][G[prevv[v]][pree[v]].rev].cap+=f;
				}
			}
		}
	}
	return fl;
}

int main(){
	cin>>N;
	ll sm=0;
	REP(i,N){
		ll a;
		cin>>a;
		if (a>0){
			sm+=a;
			add_edge(i+2,1,a);
		}else{
			add_edge(0,i+2,-a);
		}
	}
	FOR(i,1,N+1){
		FOR(j,i+1,N+1){
			if (j%i==0){
				add_edge(i+1,j+1,INF);
			}
		}
	}
	cout<<sm-mxflow()<<endl;
	return 0;
}