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 Ruby (2.3.3) (judge verdict: Accepted)

def addedge(graph, fr, to, cap)
  graph[fr]<<[to,cap,graph[to].size]
  graph[to]<<[fr,0,graph[fr].size-1]
end

def dfs (graph, used, from, sink, flow)
  return flow if from == sink
  used[from] = true
  
  graph[from].each{|edge|
    next if used[edge[0]] || (edge[1]<=0)
    
    fmin = edge[1]
    fmin = flow if fmin > flow
    
    d = dfs(graph, used, edge[0], sink, fmin)
    
    if d > 0 then
      edge[1] -= d
      graph[edge[0]][edge[2]][1] += d
      return d
    end
  }
  return 0
end

n = gets.to_i
a = gets.split.map &:to_i

#
inf = 1000000000
v = n+2
#
source = 0
sink = n+1
graph = v.times.map{[]}
used = Array.new(v, false)
#
all = 0

for j in 1..n
  #p j,a[j-1]
  if a[j-1]>0 then
    addedge(graph, source, j, a[j-1])
    all += a[j-1]
  else
    addedge(graph, j, sink, -a[j-1])
  end
  
  x = j*2
  while x<=n
    addedge(graph, x, j, inf)
    #p x, j 
    x+=j
  end
end

#fordFulkerson
flow = 0
while true
  v.times{|i| used[i]=false}
  f = dfs(graph, used, source, sink, inf)
  break if f==0
  flow += f
end

puts all-flow