#include #include #include using namespace std; #define MAX (1LL<<32) long long get(long long i); long long compute(long long i) { // positive Fibonacci numbers if (i==0) { return 1; } else if (i==1) { return 2; } else { return get(i-1) + get(i-2); } } vector f; long long get(long long i) { while (i>=f.size()) { f.push_back(compute(f.size())); } return f[i]; } int main() { bool *sums = new bool[MAX]; memset(sums, 0, MAX*sizeof(*sums)); sums[0] = true; long long total = 0; long long limit = 0; long long n = 0; for (long long v=1;; v++) { while (get(limit) < v+total) { limit++; } bool keep = true; long long d; for (long long t=limit; (d=get(t)-v)>=0; t--) { if (d=0; o--) { if (sums[o]) { if (o+v>=MAX) { long long z=0; for (long long n=0; n