1) Площадь закрашенной бумаги
Ответ:
\[ b * (a + n * c) \]
Почему: все прямоугольники идут с перекрытием, поэтому закрашенная полоса имеет ширину \(b\), а длину:
\[ a+n*c \]
Первый прямоугольник даёт длину \(a\), каждый из \(n\) сдвигов добавляет справа ещё \(c\). Проверка:
\[ 3*(4+1*2)=3*6=18 \]
2) «Жетон в подарок»
Если купить \(m\) жетонов, бесплатных будет \(m // k\), всего:
\[ m + m // k \]
Нужно минимальное \(m\), при котором это не меньше \(n\). Ищем его двоичным поиском.
import sys
def main():
k, n = map(int, sys.stdin.read().split())
left, right = 0, n
while left < right:
mid = (left + right) // 2
if mid + mid // k >= n:
right = mid
else:
left = mid + 1
print(left)
if __name__ == "__main__":
main()
Проверка примеров:
- \(k=2, n=8\): при \(m=5\) всего \(5+2=7<8\), при \(m=6\) всего \(6+3=9\), ответ 6.
- \(k=3, n=3\): при \(m=2\) всего \(2<3\), при \(m=3\) всего \(3+1=4\), ответ 3.
- \(k=1, n=5\): при \(m=2\) всего \(2+2=4<5\), при \(m=3\) всего \(3+3=6\), ответ 3.
