61 lines
3.4 KiB
Markdown
61 lines
3.4 KiB
Markdown
![]() |
---
|
|||
|
id: 5900f4111000cf542c50ff24
|
|||
|
title: 'Задача 165: Перетини'
|
|||
|
challengeType: 5
|
|||
|
forumTopicId: 301799
|
|||
|
dashedName: problem-165-intersections
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
Сегмент визначається лише двома кінцевими точками. Розглядаючи два відрізки лінії у планіметрії є три можливості: сегменти мають нуль точок, одну точку або нескінченно багато спільних точок.
|
|||
|
|
|||
|
Крім того, коли два відрізки мають лише одну спільну точку, це може бути той випадок, коли спільною точкою є кінцева точка або одного з окремих сегментів, або обох. Якщо спільна точка двох сегментів не є кінцевою точкою будь-якого із сегментів, то це внутрішня точка обох сегментів.
|
|||
|
|
|||
|
Ми назвемо спільну точку $T$ двох відрізків $L_1$ і $L_2$ справжньою точкою перетину $L_1$ і $L_2$, якщо $T$ є єдиною спільною точкою $L_1$ і $L_2$ і $T$ є внутрішньою точкою обох відрізків.
|
|||
|
|
|||
|
Розглянемо три сегменти $L_1$, $L_2$та $L_3$:
|
|||
|
|
|||
|
$\begin{align} & L_1: (27, 44) \\;\text{to}\\; (12, 32) \\\\ & L_2: (46, 53) \\;\tтекст{to}\\; (17, 62) \\\\ & L_3: (46, 70) \\;\tтекст{to}\\; (22, 40) \\\\ \end{align}$$
|
|||
|
|
|||
|
Можна перевірити, що відрізки ліній $L_2$ і $L_3$ мають справжню точку перетину. Ми зазначали, що, якщо одна з кінцевих точок $L_3$: (22, 40) лежить на $L_1$, це не вважається справжньою точкою перетину. $L_1$ і $L_2$ не мають спільної точки. Отже, на трьох відрізках прямої ми знаходимо одну справжню точку перетину.
|
|||
|
|
|||
|
Тепер зробімо те саме для 5000 прямих відрізків. З цією метою ми згенеруємо 20000 чисел, використовуючи так званий генератор псевдо-випадкових чисел «Blum Blum Shub».
|
|||
|
|
|||
|
$\begin{align} & s_0 = 290797 \\\\ & s_{n + 1} = s_n × s_n (\text{modulo}\\; 50515093) \\\\ & t_n = s_n (\text{modulo}\\; 500) \\\\ \end{align}$
|
|||
|
|
|||
|
Щоб створити кожен відрізок, ми використовуємо чотири послідовних числа $t_n$. Тобто перший відрізок дано:
|
|||
|
|
|||
|
($_t$1, $t_2$) до ($t_3$, $t_4$)
|
|||
|
|
|||
|
Перші чотири числа вичислені згідно зі згаданим генератором, мають бути: 27, 144, 12 та 232. Перший відрізок, таким чином, буде (27, 144) до (12, 232).
|
|||
|
|
|||
|
Скільки окремих точок перетину буде знайдено серед 5000 відрізків прямих ліній?
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
`distinctIntersections()` має повертати `2868868`.
|
|||
|
|
|||
|
```js
|
|||
|
assert.strictEqual(distinctIntersections(), 2868868);
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```js
|
|||
|
function distinctIntersections() {
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
distinctIntersections();
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```js
|
|||
|
// solution required
|
|||
|
```
|