Блог пользователя Kolyanchick

Автор Kolyanchick, история, 20 месяцев назад, По-русски

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

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

  • Проголосовать: нравится
  • -5
  • Проголосовать: не нравится

»
19 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Реши пожалуйста задачу Университета ИТМО: B. Большая проверка на простоту больших чисел. В их группе можно найти эту задачу. ☻

  • »
    »
    19 месяцев назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Я решал массовую проверку на простоту. Окей, сделаю

»
19 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Извините, в разборе была мелкая ошибка в коде, я её исправил, теперь код работает.