Advertisement
tiom4eg

C_HSE

Feb 6th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define FOR(i, a, b) for (int i = a; i < b; ++i)
  3. #define RFOR(i, a, b) for (int i = a; i >= b; --i)
  4. #define ll long long
  5. #pragma GCC optimize("O3,unroll-loops")
  6.  
  7. #define int long long
  8.  
  9. using namespace std;
  10.  
  11. int erat[1500001];
  12.  
  13. signed main() {
  14.     // O(n log n)
  15.     ios_base::sync_with_stdio(false); cin.tie(0);
  16.     int n, k; cin >> n >> k;
  17.     int mx = 0;
  18.     int a[n];
  19.     FOR(i, 0, n) {
  20.         cin >> a[i];
  21.         mx = max(mx, a[i]);
  22.     }
  23.     vector <int> d[mx + 1];
  24.     for (int i = 2; i <= mx; ++i) {
  25.         if (!erat[i]) {
  26.             erat[i] = i;
  27.             d[i] = {i};
  28.             for (int j = i; j <= mx; j += i) if (!erat[j]) erat[j] = i;
  29.         }
  30.         else {
  31.             int c = i;
  32.             while (c != 1) {
  33.                 d[i].push_back(erat[c]);
  34.                 c /= erat[c];
  35.             }
  36.         }
  37.     }
  38.     priority_queue <int> cur;
  39.     cur.push(1);
  40.     FOR(i, 0, n) cur.push(a[i]);
  41.     while (true) { // O(n log^2 n)
  42.         int now = cur.top();
  43.         cur.pop();
  44.         int nx = cur.top();
  45.         if (now == 1 || k < d[now][0]) {
  46.             cout << now;
  47.             return 0;
  48.         }
  49.         if (now / d[now][0] <= nx) {
  50.             k -= d[now][0];
  51.             now /= d[now][0];
  52.             cur.push(now);
  53.             continue;
  54.         }
  55.         int l = 0, r = d[now].size();
  56.         while (l < r - 1) {
  57.             int m = (l + r) / 2;
  58.             if (d[now][m] <= k && now / d[now][m] > nx) l = m;
  59.             else r = m;
  60.         }
  61.         if (r != d[now].size()) {
  62.             k -= d[now][r];
  63.             now /= d[now][r];
  64.         }
  65.         else {
  66.             k -= d[now][l];
  67.             now /= d[now][l];
  68.         }
  69.         cur.push(now);
  70.     }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement