Problem:
Score : 700 points

Problem Statement

We have N gemstones labeled 1 through N.

You can perform the following operation any number of times (possibly zero).

Select a positive integer x, and smash all the gems labeled with multiples of x.

Then, for each i, if the gem labeled i remains without getting smashed, you will receive a_i yen (the currency of Japan).
However, a_i may be negative, in which case you will be charged money.

By optimally performing the operation, how much yen can you earn?

Constraints

All input values are integers.

1 \leq N \leq 100

|a_i| \leq 10^9

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N

Output

Print the maximum amount of money that can be earned.

Sample Input 1

6
1 2 -6 4 5 3

Sample Output 1

12

It is optimal to smash Gem 3 and 6.

Sample Input 2

6
100 -100 -100 -100 100 -100

Sample Output 2

200

Sample Input 3

5
-1 -2 -3 -4 -5

Sample Output 3

0

It is optimal to smash all the gems.

Sample Input 4

2
-1000 100000

Sample Output 4

99000

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
#define N 505
#define M 100005
using namespace std;
typedef long long LL;
const LL oo=1e18;
const LL zero=1e12;
int Q[N],f[N],a[N],End[N],Next[M],Go[M],cnt;
LL Value[M],ans;
int n,m,S,T,i,j;
int BFS(){
  for (int i=1;i<=T;i++) f[i]=-1;
  int h=0,t=1;Q[1]=S;f[S]=1;
  while (h<t){
    int x=Q[++h];if (x==T) return 1;
    for (int i=End[x],y;i;i=Next[i])
      if (Value[i]&&f[y=Go[i]]==-1)
        f[y]=f[x]+1,Q[++t]=y;
  }return 0;
}
LL Dinic(int x,LL sum){
  if (x==T) return sum;LL os=sum;
  for (int i=End[x],y;i;i=Next[i])
    if (Value[i]){
      if (f[y=Go[i]]!=f[x]+1) continue;
      LL now=Dinic(y,min(os,Value[i]));
      os-=now;Value[i]-=now;Value[i^1]+=now;
    }
  if (sum==os) f[x]=-1;return sum-os;
}
void add(int u,int v,LL w){
  Go[++cnt]=v;Next[cnt]=End[u];End[u]=cnt;Value[cnt]=w;
}
void addedge(int u,int v,LL w){/*printf("%d->%d %lld\n",u,v,w);*/add(u,v,w);add(v,u,0);}
int main(){
	scanf("%d",&n);
	for (i=1;i<=n;i++) scanf("%d",&a[i]);
	S=n+1;T=n+2;cnt=1; 
	for (i=1;i<=n;i++)
	  for (j=i+1;j<=n;j++)
	    if (j%i==0) 
			  addedge(j,i,oo);
	for (i=1;i<=n;i++) 
	  addedge(S,i,zero),addedge(i,T,zero-a[i]);
	ans=0;
	while (BFS())
	  ans+=Dinic(S,oo);
	//printf("%lld\n",ans);
	printf("%lld\n",zero*n-ans);
}