Advertisement
Guest User

Untitled

a guest
Aug 25th, 2024
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include <unordered_map>
  2. #include <random>
  3. #include <iostream>
  4. #include <iomanip>
  5. using namespace std;
  6.  
  7. const int maxN = 1e4+5;
  8. int minp[maxN];
  9. long long rweight[maxN];
  10. vector<pair<long long, double>> elements;
  11.  
  12. long long calc_weight(int v) {
  13.     if (v == 1) return 0;
  14.     return rweight[minp[v]] + calc_weight(v / minp[v]);
  15. }
  16.  
  17. int main() {
  18.     mt19937 rng;
  19.     for (int i = 2; i < maxN; i++) {
  20.         if (!minp[i]) {
  21.             rweight[i] = uniform_int_distribution<long long>(0, 1e16-1)(rng);
  22.             minp[i] = i;
  23.             if (i * (long long) i < maxN)
  24.             for (int j = i*i; j < maxN; j+=i) if (!minp[j]) minp[j] = i;
  25.         }
  26.     }
  27.     for (int i = 3; i < maxN-5; i++) {
  28.         if (minp[i] == i) {
  29.             elements.push_back({calc_weight(i+4) - calc_weight(i+2), log(double(i))});
  30.         }
  31.     }
  32.     long long goal = calc_weight(43) - calc_weight(41);
  33.     double opt = 1e18;
  34.     unordered_map<long long, double> pair_sums;
  35.     long long sz = elements.size()*((long long)elements.size()-1)/2;
  36.     pair_sums.reserve(sz);
  37.     for (int i = 0; i < elements.size(); i++) {
  38.         cout << "Inserting " << i << " / " << elements.size() << " found " << opt << " size " << pair_sums.size() << endl;
  39.         long long size = elements[i].first;
  40.         double cost = elements[i].second;
  41.         if (size == goal) opt = min(opt, cost);
  42.         for (int j = 0; j < i; j++) {
  43.             size += elements[j].first;
  44.             cost += elements[j].second;
  45.             if (size == goal) opt = min(opt, cost);
  46.             double& cur = pair_sums[size];
  47.             if (cur == 0 || cur > cost) cur = cost;
  48.             size -= elements[j].first;
  49.             cost -= elements[j].second;
  50.         }
  51.     }
  52.  
  53.     for (int i = 0; i < elements.size(); i++) {
  54.         cout << "Doing " << i << " / " << elements.size() << " found " << fixed << setprecision(20) << opt << endl;
  55.         long long size = elements[i].first;
  56.         double cost = elements[i].second;
  57.         if (pair_sums.count(goal - size)) opt = min(opt, cost + pair_sums[goal - size]);
  58.         for (int j = 0; j < i; j++) {
  59.             size += elements[j].first;
  60.             cost += elements[j].second;
  61.             if (pair_sums.count(goal - size)) opt = min(opt, cost + pair_sums[goal - size]);
  62.             for (int k = 0; k < j; k++) {
  63.                 size += elements[k].first;
  64.                 cost += elements[k].second;
  65.                 if (pair_sums.count(goal - size)) opt = min(opt, cost + pair_sums[goal - size]);
  66.                 size -= elements[k].first;
  67.                 cost -= elements[k].second;
  68.             }
  69.             size -= elements[j].first;
  70.             cost -= elements[j].second;
  71.         }
  72.     }
  73.     cout << fixed << setprecision(20) << opt << '\n';
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement