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

Правка ru14, от Kolyanchick, 2023-03-29 23:28:39

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

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