Задача "Загадка последовательной суммы" — Объяснение решения

Правка ru5, от Kolyanchick, 2023-03-29 23:20:23

Примечания к задаче

Загадка последовательной суммы — простая, но интересная задачка на математическую логику, которая является первой задачей из соревнования 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

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru16 Русский Kolyanchick 2023-04-13 18:48:49 4
ru15 Русский Kolyanchick 2023-03-30 07:37:22 3 Мелкая правка: 'ет число $n - 1$.\n\nТепе' -> 'ет число $-(n - 1)$.\n\nТепе'
ru14 Русский Kolyanchick 2023-03-29 23:28:39 12
ru13 Русский Kolyanchick 2023-03-29 23:26:49 8
ru12 Русский Kolyanchick 2023-03-29 23:26:08 4 Мелкая правка: 'я **первой** задачей из соревн' -> 'я **первой задачей** из соревн'
ru11 Русский Kolyanchick 2023-03-29 23:25:45 13 Мелкая правка: 'l$ до $r$ должна ра' -> 'l$ до $r$ включительно должна ра'
ru10 Русский Kolyanchick 2023-03-29 23:24:54 10 Мелкая правка: 'т число $n$ &mdash; $1$.\n\nТеп' -> 'т число $n - 1$.\n\nТеп'
ru9 Русский Kolyanchick 2023-03-29 23:23:05 2 Мелкая правка: 'вывод:**\n0 1\n\n-' -> 'вывод:**\n\n0 1\n\n-'
ru8 Русский Kolyanchick 2023-03-29 23:22:21 4 Мелкая правка: 'о $t$ ($1$≤$t$≤$10^{4}$) ' -> 'о $t$ ($1$ ≤ $t$ ≤ $10^{4}$) '
ru7 Русский Kolyanchick 2023-03-29 23:21:47 10
ru6 Русский Kolyanchick 2023-03-29 23:21:10 6 Мелкая правка: 'исло $n$ (1≤$n$≤$10^{18}$)' -> 'исло $n$ ($1$ ≤ $n$ ≤ $10^{18}$)'
ru5 Русский Kolyanchick 2023-03-29 23:20:23 8
ru4 Русский Kolyanchick 2023-03-29 23:19:19 19 Мелкая правка: '000000\n\n1 4 2 7 3 1 5 2\n\n**Стан' -> '000000\n\n**Стан'
ru3 Русский Kolyanchick 2023-03-29 23:18:50 10
ru2 Русский Kolyanchick 2023-03-29 23:18:14 10
ru1 Русский Kolyanchick 2023-03-29 23:17:29 3977 Первая редакция (опубликовано)