Домашние задания: Информатика

Задача по информатике.

Я учусь Гос.классе с углублением в общество. Учитель информатики, мягко говоря полный идиот. Дает задачи, в которых я вообще ничего не могу понять. У него есть разбор этих тем в файле, но там ничего не понятно, сам темы не хочет объяснять, говоря есть одноклассники. Ну в общем может кто мне помочь решить задачу. Я, ну прям вообще не могу ее решить. Никак не получается. Если сможете обьяснить, то буду очень вам благодарен.
Каждые 9 пятёрок (за 3 итерации) меняются на 55, а 3 пятёрки, не входящие в девятку, меняются на одну восьмёрку.
Поэтому строка из L = 300 + k (k >= 0) пятёрок будет каждые 3 итерации укорачиваться на 7 пятёрок, пока в ней не останется менее 9 пятёрок, а их количество в этом остатке будет равно:
 r = (300 + k + 5) mod 7 + 2  ∈  [2; 8] 
Из остатка 1 или 2 группы по 3 пятёрки могут превратиться в восьмёрки. Останется:
 r mod 3    пятёрок
r div 3 восьмёрок

Поэтому надо рассмотреть семь случаев: 300, 301, 302, 303, 304, 305 и 306 (для k ∈ [0; 6], соответственно), и выяснить, где r mod 3 > r div 3.
Выпишем в табличку кол-во пятёрок и восьмёрок в финальной строке для каждого k:
 k   r  строка  c(5)  c(8)  подходит?
0 6 88 0 2 нет
1 7 885 1 2 нет
2 8 8855 2 2 нет
3 2 55 2 0 да
Остальные три случая можно не рассматривать, так как мы нашли минималку.
 L = 303 
Впрочем, если их перебрать, то увидим, что под условие, кроме 303, подойдёт только 306. И, соответственно, 310, 313, 317, 320, 324, 327...

Можно было найти это и полностью аналитически: r не может быть менее 2-х, значит, пятёрок останется две (третья если есть, то попадёт в замену, а одна пятёрка может остаться только с восьмёркой, что не подходит).
Подходящие строки: 855, 55, для r = 5 или 2, при k = 6 или 3, и L = 306 или 303, соответственно.

А вот питоновский быдлокод для проверки рассуждений:
 s = "5" * (int(input("Длина: 300 + ")) + 300)
while "555" in s or "888" in s:
s = s.replace("555", "8", 1).replace("888", "55", 1)
c5, c8 = s.count("5"), s.count("8")
print(s, c5, c8, ("" if c5 > c8 else "не ") + "подходит")
Он запрашивает длину исходной строки (превышение над 300) и запускает быдлоцикл, выполняющий быдлозамены, и в конце выводит, подходит изначальная длина строки под условие или нет. Можно добавить в тело цикла быд... в общем, отладочную печать print(s), чтобы посмотреть, как меняется строка при каждом проходе. Запустить можно на onlinegdb.
Игорь Чайков
Игорь Чайков
87 571
Лучший ответ
Иван Алмазов Спасибо огромное, очень выручил.