todualzeck0(n) = { my (s=0, v=0); for (i=0, oo, if (s>=n, forstep (j=i-1, 0, -1, if (s-fibonacci(2+j)>=n, s-=fibonacci(2+j); v-=2^j;);); return (v);); s+=fibonacci(2+i); v+=2^i;); }

cache = [todualzeck0(1)]

todualzeck(n) = {
	while (#cache < n,
		cache = concat(cache, apply (todualzeck0, [#cache+1..2*#cache]));
	);

	if (n, cache[n], 0)
}

missing(n) = 2^#binary(n)-1-n

s = 0
unseen = 0
seen(v) = bittest(s, v)
see(v) = s = bitor(s, 2^v); while (seen(unseen), unseen++)

other(p) = {
	see(p);
	my (mp = missing(todualzeck(p)));
	for (v = unseen, oo,
		if (!seen(v) && bitand(missing(todualzeck(v)), mp)==0,
			return (v);
		);
	);
}

for (n = 0, 10 000, print (n " " v = if (n==0, 0, other(v))))

quit