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