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<bits/stdc++.h>
#define lld long long int
#define ld long double
#define mod 1000000007
#define modd 998244353
#define all(v) v.begin(),v.end()
#define rep(i,a,b)	for(lld i=a;i<=b;i++)
#define repr(i,a,b) for(lld i=a;i>=b;i--)
#define ar array
#define pb push_back
#define mp make_pair
#define ios ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
lld n,m;
lld arr[300000];
lld sum[300000];
vector<lld> facs[300000];
map<lld,bool> ma;
int main()
{
     ios;
     lld TESTS,q,a,s,b,l,r,c,k,p,h,w,d,x,y,z,xs,ys,t;
     TESTS=1;
     //cin>>TESTS;
     while(TESTS--)
     {
         cin>>n;
         lld tot=0;
         rep(i,1,n)cin>>arr[i],tot+=arr[i];
         rep(i,1,n) rep(j,1,i) if (i%j==0)facs[i].pb(j);
         rep(i,1,n) {
            sum[i]=0;
            for (lld j=i;j<=n;j+=i) sum[i]+=arr[j];
         }
         while(true){
            ar<lld,2> mini={(lld)1e15,-1};
            repr(i,n,1) if (sum[i]<0) {mini={sum[i],i};break;}
            if (mini[0]>=0)break;
            tot-=mini[0];
            //sum[mini[1]]=1e15;
            for (lld j=mini[1];j<=n;j+=mini[1]){
                if (ma[j])continue;
                ma[j]=true;
                for (auto it:facs[j])sum[it]-=arr[j];
            }
         }
         cout<<tot;
     }
    return 0;
}