def f(m, n): num_ways = 1 for b in range(1, (n + 1) // (m + 1) + 1): lim = n - b + 1 for c in combinations_with_limit(b, m, lim): p = n - sum(c) + 1 num_ways += bicoeff(p, b) * count_permutations(c) return num_ways
def e117(): units = 50 num_ways = 0 for r in range(units // 2 + 1): for g in range((units - 2 * r) // 3 + 1): for b in range((units - 2 * r - 3 * g) // 4 + 1): p = units - 2 * r - 3 * g - 4 * b + r + g + b blocks = r + g + b c1 = bicoeff(p, blocks) c2 = multinomial_coefficient(blocks, (r, g, b)) num_ways += c1 * c2 return num_ways
def f(m, n): num_ways = 0 for b in range(1, m // n + 1): num_ways += bicoeff(m - b * (n - 1), b) return num_ways