e-olimp 197. Отрезок и окружности

Задача

На плоскости задана система концентрических окружностей, центры которых находятся в начале координат, а радиусы равны $1, 2, 3, \ldots$ Также на плоскости задан отрезок, концы которого находятся в точках [latex] (x_{1};y_{1}) [/latex], [latex] (x_{2};y_{2}) [/latex].
Необходимо найти число общих точек этого отрезка и указанной системы окружностей.

Входные данные

Первая строка входного файла содержит 4 целых числа [latex]x_{1}[/latex], [latex]y_{1}[/latex], [latex]x_{2}[/latex], [latex]y_{2}[/latex]. Эти числа не превосходят $10^3$ по абсолютной величине. Заданный отрезок имеет ненулевую длину.

Выходные данные

В выходной файл выведите ответ на задачу.

Тесты

Входные данные Выходные данные
-1 -1 1 1 2
-1 1 1 1 1
1 1 2 1 1
-5 -5 5 -5 5
-10 10 -10 10 28

Код программы

Решение задачи

Для начала рассмотрим первое условие. Пусть наш отрезок таков, что при движении от одного края к другому, расстояние до начала координат возрастает. Для такого отрезка ответ очевиден — это количество целых чисел между расстояниями от начала координат до обоих концов отрезка. Условие из шестнадцатой строчки кода получилось путем приведения подобных и раскрытия скобок следующих неравенств:
[latex]x_{1}^{2}+y_{1}^{2}-x_{2}^{2}-y_{2}^{2}+(x_{1}-x_{2})^{2}+(y_{1}-y_{2})^{2}<0[/latex] и [latex]-x_{1}^{2}-y_{1}^{2}+x_{2}^{2}+y_{2}^{2}+(x_{1}-x_{2})^{2}+(y_{1}-y_{2})^{2}<0[/latex]

Иначе сведем данную задачу к рассмотренной выше. Для этого необходимо найти на отрезке точку, ближайшую к началу координат. Таким образом исходный отрезок разбивается на два новых, для которых выполнено условие из простой задачи. Также следует рассмотреть крайний случай, а именно, если ближайшая к [latex] (0;0) [/latex] точка находится на целом расстоянии от начала координат. В этом случае мы посчитаем это пересечение дважды, поэтому необходимо уменьшить ответ на единицу.

Стоит заметить, что находить саму ближайшую точку нет необходимости. Достаточно найти лишь расстояние до нее. Также мы добавляем маленькую константу [latex]\varepsilon=10^{-8}[/latex] к большему расстоянию до конца отрезка и отнимаем из меньшего, чтобы избежать случая нахождения какой-либо точки отрезка на окружности. В противном случае решение задачи будет работать не корректно.

Ссылки

Условие задачи на e-olymp

Код решения

 

Ю2.13

Задача: Проверить, лежит ли окружность [latex]{(x-{a}_{1})}^{2}+{(y-{b}_{1})}^{2}={r}_{1}^{2}[/latex] целиком внутри окружности [latex]{(x-{a}_{2})}^{2}+{(y-{b}_{2})}^{2}={r}_{2}^{2}[/latex] или наоборот.

Тестирование:

Ввод Вывод
[latex]a_{1}[/latex] [latex]b_{1}[/latex] [latex]r_{1}[/latex] [latex]a_{2}[/latex] [latex]b_{2}[/latex] [latex]r_{2}[/latex]  Печать Комментарий
 0  0  0  0  0  0  2 в 1  Пройден
 0  0  3  0  0  1  2 в 1  Пройден
 0  0  2  0  0  5  1 в 2  Пройден
 1  1  3  3  1  1  2 в 1  Пройден
 2  2  3  6  2  4  ——  Пройден
 24  27  51  96  48  20  ——  Пройден

Код:

Идея решение: Расстояние между центрами окружностей [latex]({a}_{1};{b}_{1})[/latex] и [latex]({a}_{2};{b}_{2})[/latex] должно быть меньше, чем модуль разности их радиусов [latex]\left|{r}_{1}-{r}_{2}\right|[/latex]. Это условие необходимо и достаточно для того, чтобы одна из окружностей была вложена в другую.