Please read the new rule regarding the restriction on the use of AI tools. ×

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

Revision ru16, by Kolyanchick, 2023-04-13 18:48:49

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

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

t = 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)$$$.

Теперь нам достаточно просто вывести наши полученные значения, это и будет решением задачи:

t = int(input())
for i in range(t):
    n = int(input())
    print(-(n - 1), n)

Мой комментарий

Вот таким вот получился разбор, это был мой первый опыт объяснения задачи на логику в блоге, очень надеюсь, что вам понравилось. Если так и есть, то обязательно голосуйте плюсиком за этот разбор, мне будет очень приятно :)

Обязательно делитесь своим мнением по поводу этого разбора в комментариях! Если вам что-то непонятно, вы хотите предложить задачу на разбор или рассказать о вашем решении, то обязательно пишите в комментариях ваши сообщения, я буду очень рад с вами пообщаться!

Всем удачи! :D

History

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