Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>s
- #include <set>
- #include <cmath>
- #define TASK ""
- #define ffor(a, n, i) for(int i = a; i < n; i++)
- #define bfor(a, n, i) for(int i = a; i >= n; i--)
- #define all(a) a.begin(), a.end()
- #define rall(a) a.rbegin(), a.rend()
- typedef long long ll;
- using namespace std;
- int LL_INF = (long long)3 * 1e18 + 9;
- int INT_INF = 1 * 1e9 + 9;
- set<int> intersection;
- int in[1000001], out[1000001];
- set<int> numbers[1000001];
- int arr[100000];
- int main()
- {
- int n;
- ll ans = 0;
- cin >> n;
- for (int i = 0; i < n; i++)
- {
- int a;
- scanf("%d", &a);
- arr[i] = a;
- for (int j = 1; j * j <= a; j++)
- {
- if (a%j == 0)
- {
- int d1, d2;
- d1 = j;
- d2 = a / j;
- out[d1]++;
- numbers[d1].insert(i);
- if (d1 != d2)
- {
- out[d2]++;
- numbers[d2].insert(i);
- }
- }
- }
- }
- for (int i = 0; i < n; i++)
- {
- int ind = *numbers[1].begin();
- int number = arr[ind];
- if (i != 0)
- {
- set<int>::iterator it = intersection.end();
- it--;
- int max_div = *it;
- ind = *numbers[max_div].begin();
- number = arr[ind];
- ans += max_div;
- }
- for (int j = 1; j * j <= number; j++)
- {
- if (number%j == 0)
- {
- int d1 = j, d2 = number / j;
- out[d1]--;
- in[d1]++;
- if (out[d1] == 0)
- intersection.erase(d1);
- if (in[d1] == 1 && out[d1] != 0)
- intersection.insert(d1);
- numbers[d1].erase(ind);
- if (d1 != d2)
- {
- out[d2]--;
- in[d2]++;
- if (out[d2] == 0)
- intersection.erase(d2);
- if (in[d2] == 1 && out[d2] != 0)
- intersection.insert(d2);
- numbers[d2].erase(ind);
- }
- }
- }
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement