#include #include #include #include using namespace std; #define MAX (1LL<<30) bool *small = 0; unordered_set big; bool seen(long long v) { if (v0; } } void see(long long v) { if (v mm; int main() { small = new bool[MAX]; memset(small, 0, sizeof(*small)*MAX); mm.push_back(0); long long v = 1; long long t = 1; // power of 2 long long x = 0; // t=2^x for (long long n=1;; n++) { see(v); if (v==t) { cout << x << ' ' << n << endl; t*=2; x++; } size_t mx = 0; long long w = v; bool found = false; while (!found) { size_t omx = mx; for (size_t i=0; i<=omx; i++) { if ((mm[i] & w)==0) { long long m = mm[i] + w; if (!seen(m/v)) { v = m/v; found = true; break; } else { mx++; if (mx==mm.size()) { mm.resize(2*mm.size()); } mm[mx] = m; } } } w*=2; if (w>=(1LL<<62)) { goto end; } } } end: delete[] small; return 0; }