<
>
Цитата дня
«Если человек не желает по утрам заниматься бегом, ничто не может его остановить». Йоги Берра

Лягушка и прыжки

Сумма арифметической прогрессии натурального ряда чисел, проверка числа на его "целостность"

Лягушка живет на координатной оси oX в точке 1. Она решила переместиться в точку n, в которой живет ее друг. Для перемещения лягушка может выбрать целое положительное число x и совершать прыжки вправо, причем длина первого прыжка будет равна x, длина второго прыжка будет равна x + 1, длина третьего прыжка будет равна x + 2 и так далее. Другими словами, длина i-го прыжка лягушки будет равна x + i - 1. Лягушка хочет выбрать число x таким образом, чтобы попасть с помощью прыжков из точки 1 строго в точку n. Количество прыжков может быть произвольным. Помогите лягушке и определите количество различных чисел x, с помощью которых она может попасть из точки 1 в точку n, а также сами значения x.

Входные данные

В первой строке следует целое число n (2 <= n <= 10^12) — точка, в которую нужно попасть лягушке.

Выходные данные

В первую строку выведите целое число p — количество различных x, выбрав которые, лягушка может попасть из точки 1 строго в точку n.

Во вторую строку выведите p целых чисел — значения x, выбрав которые, лягушка может попасть из точки 1 строго в точку n.

Каждое из подходящих значений x должно быть выведено ровно один раз. Все подходящие значения x должны быть выведены в строго возраста

ПОЯСНЕНИЕ

Зададимся вопросом: на какую длину сместится лягушка после i-го прыжка, если длина первого прыжка
L1 = x
L1 = x
L2 = L1 + 1 = x + 1
L3 = L2 + (x + 2) = (x + 1) + (x + 2) = 2x + 3
L4 = L3 + (x + 3) = (2x + 3) + (x + 3) = 3x + 6
L5 = L4 + (x + 4) = (3x + 6) + (x + 4) = 4x + 10

Можем заметит, что числа 1, 3, 6, 10 являются суммами арифметических прогрессий S(i) натурального ряда чисел:
S(1) = 1
S(2) = 1 + 2 = 3
S(3) = 1 + 2 + 3 = 6
S(4) = 1 + 2 + 3 + 4 = 10

Таким образом, после i-го прыжка лягушка сместится на расстояние:

Li = (i - 1) * x + S(i - 1),

Вспоминая формулу арифметической прогрессии натурального ряда S(n) = n * (n + 1) / 2, получим

Li = (i - 1) * x + (i - 1) * ((i - 1) + 1) / 2

или

Li = (i - 1) * x + i * (i - 1) / 2

или

Li = (i - 1) * (x + i / 2)

Тогда после i-го шага лягушка должна оказаться в точке с координатой

n = Li + 1 (нарисуй рисунок и убедись!)

или

n = (i - 1) * (x + i / 2) + 1,

выразим отсюда x

x = (n - 1) / (i - 1) - i / 2,

приводя к общему знаменателю, получим

x = (2 * (n - 1) - i * (i - 1)) / (2 * (i - 1)) (*)

Задачу можно сформулировать следующим образом:

необходимо найти все i, для которых выражение (*) одновременно удовлетворяет следующим условиям:

  1. x <= n (лягушка не перепрыгнула через друга)
  2. x > 0 (целое положительное число, оказывается можно подобрать такое количество прыжков i, что x окажется меньше нуля)
  3. x целое число (из условия ясно, что координаты целые числа)
  4. Примечание: формула (*) применима для i > 1 (при i = 1, знаменатель обращается в ноль)

АЛГОРИТМ

  1. Для n = 2 вывести ответ (наша формула не работает для данного случая)
  2. Перебрать по порядку все возможные i начиная с двух, пока x не станет больше n или меньше нуля
  3. 2.1 При этом необходимо подсчитать, для скольких i, значение координаты x целое число.

  4. Перебрать в обратном порядке все возможные i, начиная со значения, получившегося в п.2, до двух.

    3.1 При этом необходимо выводить только целые значения координаты x. Не забыть добавить 1