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: Wrong Answer)

#include<iostream>
#include <list>
#include<stack>
#include<queue>
#include <vector>
#include <set>
#include <map>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#include<string>
#include <functional>
#include"time.h"
using namespace std;

#define FOR(k,m,n) for(int (k)=(m);(k)<(n);(k)++)
#define REP(i,n) FOR((i),0,(n))
#define LL long long
#define CLR(a) memset((a),0,sizeof(a))
#define SZ(x) (int((x).size()))
#define dump(x)  cerr << #x << " = " << (x) << endl
#define WAITING(str) int str;std::cin>>str;
#define DEBUGING(str) cout<<str<<endl
const int INF = (1 << 30);

//毎回変える場所
#define N_MAX 200

int N;
vector<LL> a;

LL checkMin(vector<LL> b,int card) {
start:
	if (card < 1) {
		LL ans = 0;
		REP(i, N + 1)ans += b[i];
		return ans;
	}
	LL point = 0;
	bool dif = false;
	for (int check = 1; card*check <= N; check++) {
		point += b[card*check];
		if (b[card*check] > 0)dif = true;
	}
	//消したら得なら
	if (point < 0) {
		//正の数が混じってるなら
		if (dif) {
			//消さない場合を試す
			vector<LL> c = b;
			LL ifnotDel = checkMin(c, card - 1);
			//消す場合を試す
			vector<LL> d = b;
			for (int check = 1; card*check <= N; check++) {
				d[card*check] = 0;
			}
			LL ifDel = checkMin(d, card - 1);

			//良い方を採用
			return max(ifDel, ifnotDel);
		}
		//全部負の数だけなら
		else {
			for (int check = 1; card*check <= N; check++) {
				b[card*check] = 0;
			}
			card--;
			goto start;
		}
	}
	else {
		card--;
		goto start;
	}
}

int main() {
	cin >> N;
	a.push_back(0);
	REP(i, N) {
		LL tmp;
		cin >> tmp;
		a.push_back(tmp);
	}


	//答え
	cout << checkMin(a, N) << endl;
	cin >> N;
}