-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgcdweirdeas.cpp
58 lines (45 loc) · 1.22 KB
/
gcdweirdeas.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pi = pair<ll, ll>;
using vi = vector<ll>;
using vpi = vector<pi>;
using vb = vector<bool>;
const int ma = 20000002;
ll cnt[ma + 8];
long long dp[ma + 8];
ll primes[ma + 8];
ll vis[ma + 8];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll n;
cin >> n;
vi a(n);
for (ll i = 0; i < n; i++) {
cin >> a[i];
}
for (ll i = 0; i < n; i++) {
cnt[a[i]]++;
}
ll lst = 0;
// find p-fact of the numbers ans use it to upd primes freq
for (long long i = 2; i <= ma; i++) {
if (vis[i] || i * i > ma) continue;
primes[lst++] = i;
for (ll j = i * i; j <= ma; j += i) {
vis[j] = true;
}
}
for (int i = 1; i <= ma; ++i)
for (int j = 2 * i; j <= ma; j += i)
cnt[i] += cnt[j];
long long best = 0;
for (ll x = 1; x <= ma; x++)
for (ll v = 0; (v < lst) && (x * primes[v] <= ma); v++)
dp[primes[v] * x] = max(dp[primes[v] * x], dp[x] + (long long)x * (cnt[x] - cnt[primes[v] * x]));
for (ll x = 1; x <= ma; x++)
best = max(best, dp[x] + x * cnt[x]);
cout << best << endl;
return 0;
}