English version is in beta. All contents of the site should be already translated (mostly using machine translation), and everything should work properly. However, if you find any problems, please contact me.

Разбор задачи "Строки в книге"

Первая идея, которая возникает в этой задаче -- это написать N mod K и N div K+1. Но, к сожалению, это не работает, когда N делится на K.

Если бы в этой задаче можно было бы пользоваться условным оператором (if), то все было бы просто. Если бы эта задача была бы на реальной олимпиаде, то, конечно, так и пишите if. Но здесь в учебных целях if'ом пользоваться нельзя.

На помощь придет следующая идея. Давайте сначала попробуем решить немного другую задачу: будем считать, что всё, что есть в этой задаче — строки в книге, страницы и строки на странице — нумеруется с нуля. (А количество строк на странице, конечно, как и раньше считается с 1.) Тогда, если, например, K=3, то на нулевой странице идут строки 0, 1, 2; на первой странице идут строки 3 4 5 и т.д. И несложно видеть, что вот как раз в этом случае достаточно просто разделить N на K; ответом будет N div K и N mod K; это работает во всех случаях.

Теперь вернемся к нашей задаче. Нам вводится номер строки, если считать с единицы. Попробуем свести нашу задачу к той, которую мы только что решили; для этого вычтем из N единицу — получится номер строки в книге как если бы нумерация шла с нуля. Дальше разделим полученное число с остатком на K и получим правильные номер страницы и номер строки на странице, только нумерация всего всё еще идет с нуля. Прибавим к ответам 1, чтобы получить нумерацию с единицы.

Итого решение задачи: (N-1) div K + 1 и (N-1) mod K + 1.

Вообще, это очень полезная идея — если задача плохо решается при нумерации с единицы, иногда оказывается намного проще перейти к нумерации с нуля. Особенно вот в подобных задачах, где вам явно надо делить на равные части.