#include #include using namespace std; typedef long long int ll; const ll goal = 3407298087646051ll; const ll N = 48; const ll limit = 1 << (N/2); const ll first_half[N] = { 26202120271102ll, 135428455329960ll, 226145215191180ll, 38455307198310ll, 158395314926886ll, 277270108468340ll, 38078189488823ll, 7031915446272ll, 247000637688469ll, 228977091817671ll, 256367647107166ll, 190531347466612ll, 206895433573789ll, 168781003454738ll, 28930412047822ll, 188583634192561ll, 34220655142866ll, 126339871758705ll, 186833711857971ll, 40038576937759ll, 257739027555181ll, 191847862752289ll, 49450796464709ll, 94828960768221ll }; const ll second_half[N] = { 26429280575443ll, 141300452697398ll, 89608755458014ll, 24069321165527ll, 269955250224311ll, 137049179130697ll, 30013333805191ll, 45524295173439ll, 259726767088158ll, 62421348646183ll, 226835227234443ll, 8307450244249ll, 115379801108132ll, 164730692261102ll, 72682278146483ll, 48841420576159ll, 48754324556907ll, 157844925781173ll, 177587100004140ll, 151008742623371ll, 251706689387188ll, 32611554746822ll, 43532371092965ll, 5830775211360ll }; int main() { unordered_map second_half_goals; for(ll i = 0; i < limit; i++) { ll k = i; ll u = 0; ll subset_sum = 0; while(k > 0) { if(k % 2) { subset_sum += first_half[u]; } k /= 2; u++; } second_half_goals[goal - subset_sum] = i; } for(ll j = 0; j < limit; j++) { ll k = j; ll u = 0; ll subset_sum = 0; while(k > 0) { if(k % 2) { subset_sum += second_half[u]; } k /= 2; u++; } if(second_half_goals.count(subset_sum)) { ll i = second_half_goals[subset_sum]; cout << "Found answer " << i << " " << j << "\n"; } } return 0; }