from functools import cache, reduce
from math import gcd
from fractions import Fraction

lcm = lambda xs: reduce(lambda acc, x: acc * x // gcd(acc, x), xs) 
@cache
def dp(tup):
    m = len(tup)
    idx = next((i for i in range(m) if tup[i] == 0), None)
    if idx is not None:
        return [1 if i == idx else 0 for i in range(m)]
    ans = [0 for _ in range(m)]
    for i in range(m):
        lst = list(tup)
        s = sum(tup)
        q = lst[i]
        if lst[i] > 0:
            lst[i] -= 1
            t = tuple(lst)
            for j, d in enumerate(dp(t)):
                ans[j] += Fraction(q, s) * d
    return ans
    
def divide_pot(wins):
    fracs = dp(tuple(wins))
    print("fracs :", fracs)
    den = lcm([x.denominator for x in fracs])
    return [x.numerator * (den // x.denominator) for x in fracs]

r = divide_pot([5,3,2])
print(r)

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: