Mountebank

subset sum solver

Sep 16th, 2024 (edited)
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <unordered_map>
  3. using namespace std;
  4.  
  5. typedef long long int ll;
  6.  
  7. const ll goal = 3407298087646051ll;
  8. const ll N = 48;
  9. const ll limit = 1 << (N/2);
  10. const ll first_half[N] = {
  11.     26202120271102ll, 135428455329960ll, 226145215191180ll, 38455307198310ll,
  12.     158395314926886ll, 277270108468340ll, 38078189488823ll, 7031915446272ll,
  13.     247000637688469ll, 228977091817671ll, 256367647107166ll, 190531347466612ll,
  14.     206895433573789ll, 168781003454738ll, 28930412047822ll, 188583634192561ll,
  15.     34220655142866ll, 126339871758705ll, 186833711857971ll, 40038576937759ll,
  16.     257739027555181ll, 191847862752289ll, 49450796464709ll, 94828960768221ll
  17. };
  18. const ll second_half[N] = {
  19.     26429280575443ll, 141300452697398ll, 89608755458014ll, 24069321165527ll,
  20.     269955250224311ll, 137049179130697ll, 30013333805191ll, 45524295173439ll,
  21.     259726767088158ll, 62421348646183ll, 226835227234443ll, 8307450244249ll,
  22.     115379801108132ll, 164730692261102ll, 72682278146483ll, 48841420576159ll,
  23.     48754324556907ll, 157844925781173ll, 177587100004140ll, 151008742623371ll,
  24.     251706689387188ll, 32611554746822ll, 43532371092965ll, 5830775211360ll
  25. };
  26.  
  27. int main() {
  28.     unordered_map<ll, ll> second_half_goals;
  29.     for(ll i = 0; i < limit; i++) {
  30.         ll k = i;
  31.         ll u = 0;
  32.         ll subset_sum = 0;
  33.         while(k > 0) {
  34.             if(k % 2) {
  35.                 subset_sum += first_half[u];
  36.             }
  37.             k /= 2; u++;
  38.         }
  39.         second_half_goals[goal - subset_sum] = i;
  40.     }
  41.     for(ll j = 0; j < limit; j++) {
  42.         ll k = j;
  43.         ll u = 0;
  44.         ll subset_sum = 0;
  45.         while(k > 0) {
  46.             if(k % 2) {
  47.                 subset_sum += second_half[u];
  48.             }
  49.             k /= 2; u++;
  50.         }
  51.         if(second_half_goals.count(subset_sum)) {
  52.             ll i = second_half_goals[subset_sum];
  53.             cout << "Found answer " << i << " " << j << "\n";
  54.         }
  55.     }
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment