Решение
Решение на 60 баллов использует простое моделирование. Сначала посчитаем, на
какой день недели приходится 13-е число первого месяца, затем будем считать, на какой день
недели приходится 13-е число каждого следующего месяца. Если пронумеровать дни недели
от 1 до 6, а воскресенье считать днём недели номер 0, то для получения дня недели 13-го
числа следующего месяца нужно к текущему номеру дня недели прибавить 30 и взять
остаток от деления на 7. Повторяем это в цикле
N раз и при получении числа 5 увеличиваем
ответ на 1. Пример решения на языке Python:
N = int(input())
k = int(input())
ans = 0
k = (k + 12) % 7
for i in range(N):
if k == 5:
ans += 1
k = (k + 30) % 7
print(ans)
Такое решение будет получать результат «превышено максимальное время работы»
при больших
значениях N, так как за 1 секунду невозможно выполнить цикл в 10
9
шагов.
Для решения задачи на полный балл заметим, что поскольку числа 7 и 30 — взаимно
простые, то в последовательности дней недели, на которые выпадают 13-е числа месяца
будет цикл длины 7: пятница, воскресенье, вторник, четверг, суббота, понедельник, среда.
Поэтому для нахождения ответа достаточно
найти первый месяц года, в
котором будет
пятница 13-е, и к ответу добавить количество оставшихся месяцев в году, деленное на 7
нацело. Пример решения, набирающего полный балл:
N = int(input())
k = int(input())
k = (k + 12) % 7
i = 1
ans = 0
while i <= N and k != 5:
i += 1
k = (k + 30) % 7
if i > N:
print(0)
else:
print(1 + (N - i) // 7)
Страница 4 из 8