Здравствуйте! Алгоритм в файле "27-71.py" выдает неверный ответ 99990 (правильный 99989 как на сайте). Это из-за того, что количество элементов в цепочке вычисляются неверно:
curLen = i - tail[r][1] + 1
В i хранится индекс последнего члена общей суммы, в tail[r][1] хранится индекс последнего члена суммы с нужным остатком r. Чтобы узнать сколько членов между двумя индексами нужно из большего индекса вычесть меньший. Например, 7 - 4 = 3, три члена: 5, 6, 7. Единицу прибавлять ненужно.
При этом в виде начального индекса заносится 0:
tail = [(0,0)] + [(None,0)]*(D-1)
что неверно, потому что получается, что для последовательности без остатка нужно из суммы вычесть первый элемент, а его вычитать ненужно.
Правильный способ вычислять количество элементов:
curLen = i - tail[r][1]
А начальное значение должно быть таким:
tail = [(0,-1)] + [(None,0)]*(D-1)
Тогда даже если максимальная цепочка будет с нулевого (первого) элемента, то получится i - (-1) = i + 1 = длина массива с элементами.