Примечания к задаче
Загадка последовательной суммы — простая, но интересная задачка на математическую логику, которая является первой задачей из соревнования Codeforces Round 747 (Div. 2).
Условия к задаче
Данные
Имя входного файла: Стандартный ввод / input.txt
Имя выходного файла: Стандартный вывод / output.txt
Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мегабайт
Условие
У Теофаниса есть для вас загадка, и, если вы сможете ее решить, он угостит вас халлуми — кипрским сыром.
Вам задано целое число $$$n$$$. Вам нужно найти два целых числа $$$l$$$ и $$$r$$$ таких, что $$$−10^{18}$$$ ≤ $$$l$$$ < $$$r$$$ ≤ $$$10^{18}$$$ и $$$l$$$ + ($$$l$$$+1) + … + ($$$r$$$−1) + $$$r$$$ = $$$n$$$. ..
Формат входных данных
В первой строке задано одно целое число $$$t$$$ ($$$1$$$ ≤ $$$t$$$ ≤ $$$10^{4}$$$) — количество наборов входных данных.
В первой и единственной строке каждого набора входных данных задано одно целое число $$$n$$$ ($$$1$$$ ≤ $$$n$$$ ≤ $$$10^{18}$$$).
Формат выходных данных
Для каждого набора входных данных выведите два целых числа $$$l$$$ и $$$r$$$ таких, что $$$−10^{18}$$$ ≤ $$$l$$$ < $$$r$$$ ≤ $$$10^{18}$$$ и $$$l$$$ + ($$$l$$$+1) + … + ($$$r$$$−1) + $$$r$$$ = $$$n$$$.
Можно показать, что ответ всегда существует. Если существует несколько ответов, выведите любой.
Пример
Стандартный ввод:
7
1
2
3
6
100
25
3000000000000
Стандартный вывод:
0 1
-1 2
1 2
1 3
18 22
-2 7
999999999999 1000000000001
Объяснение задачи
Ввод
Первым делом, мы должны прописать правильный ввод данных.
Ввод данных здесь очень простой, мы должны просто ввести число t, после чего t раз ввести число n при помощи цикла for:
n = int(input())
for i in range(t):
n = int(input())
pass
Ничего не делающий оператор-заглушка pass оставлен для удобства, он показывает место, где мы ещё не успели дописать код.
Алгоритм решения
Итак, что же делать дальше? Как решить задачу? Фактически, нам нужно найти числа $$$l$$$ и $$$r$$$ такие, что сумма арифметической прогрессии от $$$l$$$ до $$$r$$$ включительно должна равняться данному числу $$$n$$$. Но как это сделать?
На самом деле, эта задача очень простая, просто её условные тесты очень сильно путают нас. Такие тесты делают очень часто, если в задаче есть несколько вариантов ответа, и вас просят вывести любой из них, поэтому обязательно проверяйте, сказано ли в условии, что к задаче есть несколько вариантов ответа.
Итак, в условии нам сказано, что числа $$$l$$$ и $$$r$$$ могут быть с любым знаком, это важно. Логика здесь очень простая: никто не поспорит с тем, что если взять произвольное целое неотрицательное число $$$x$$$, то сумма арифметической прогрессии от $$$-x$$$ до $$$x$$$ равна нулю (например, от $$$-2$$$ до $$$2$$$, тогда $$$-2$$$ + $$$-1$$$ + $$$0$$$ + $$$1$$$ + $$$2$$$ = 0). Отсюда в сумме арифметической прогрессии от $$$-x$$$ до $$$x$$$ + $$$1$$$ ($$$-x$$$...$$$x$$$ + $$$x$$$ + $$$1$$$) $$$-x$$$...$$$x$$$ можно заменить на $$$0$$$, тогда получим $$$0$$$ + $$$x$$$ + $$$1$$$, что равно $$$x$$$ + $$$1$$$ (например, от $$$-2$$$ до $$$3$$$, тогда $$$-2$$$ + $$$-1$$$ + $$$0$$$ + $$$1$$$ + $$$2$$$ + $$$3$$$ = 3). Теперь, вместо $$$x$$$ + $$$1$$$ нам достаточно подставить данное нам число $$$n$$$, это будет ответ $$$r$$$. Тогда, ответом $$$l$$$, соответственно, будет число $$$n - 1$$$.
Теперь нам достаточно просто вывести наши полученные значения, это и будет решением задачи:
n = int(input())
for i in range(t):
n = int(input())
print(-(n - 1), n)
Мой комментарий
Вот таким вот получился разбор, это был мой первый опыт объяснения задачи на логику в блоге, очень надеюсь, что вам понравилось. Если так и есть, то обязательно голосуйте плюсиком за этот разбор, мне будет очень приятно :)
Обязательно делитесь своим мнением по поводу этого разбора в комментариях! Если вам что-то непонятно, вы хотите предложить задачу на разбор или рассказать о вашем решении, то обязательно пишите в комментариях ваши сообщения, я буду очень рад с вами пообщаться!
Всем удачи! :D