Problem 114

Counting block combinations II

Problem 116

Counting block combinations II

Problem 115

NOTE: This is a more difficult version of Problem 114.
A row measuring n units in length has red blocks with a minimum length of m units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one black square.
Let the fill-count function, F(m, n), represent the number of ways that a row can be filled.
For example, F(3, 29) = 673135 and F(3, 30) = 1089155.
That is, for m = 3, it can be seen that n = 30 is the smallest value for which the fill-count function first exceeds one million.
In the same way, for m = 10, it can be verified that F(10, 56) = 880711 and F(10, 57) = 1148904, so n = 57 is the least value for which the fill-count function first exceeds one million.
For m = 50, find the least value of n for which the fill-count function first exceeds one million.
from itertools import count
from tools import memoize_two_values


@memoize_two_values
def ways(min_len, blocks):
    # All black
    total = 1
    for l in range(min_len, blocks + 1):
        for pos in range(blocks - l + 1):
            total += ways(min_len, (blocks - (l + pos) - 1))

    return total


def run(limit=1000000):
    for i in count(1):
        if ways(50, i) > limit:
            return i