Task 103. Количество пересечений
UniLecsЗадача: даны две параллельные прямые, на первой прямой есть N точек, на второй M точек. Каждая точка первой прямой соединена отрезком с каждой точкой другой прямой. Точки расположены таким образом, что кол-во точек пересечений максимально. Необходимо определить максимально возможное кол-во точек пересечения, расположенных между двумя такими прямыми.
Входные данные: N, M - натуральные числа от 1 до 10^3.
Вывод: максимально возможное кол-во точек пересечения.
Пример: N = 2, M = 3
Answer = 3

Идея: рассмотрим сначала частный случай, далее на его основе перейдем к общему случаю. Положим f(N, M) - максимальное кол-во точек пересечения.
Частный случай: очевидно, что f(1, M) = 0. То есть когда на первой прямой всего одна точка, то никакие два отрезка не пересекаются.
Обощаем. Пусть n1, n2, .., nN - точки первой прямой, m1, m2, .., mM - точки второй прямой. Соединим точку n1 с точками m1, m2, .., mM. На отрезке (n1, m1) точек пересечения не будет. Но на след.отрезке (n1, m2) будут лежать точки пересечения с отрезками (m1, n2), (m1, n3), ..., (m1, nN) (всего точек будет N - 1).
Получаем, что на отрезке (n1, mj) будут лежать точки пересечения с отрезками (mi, xk), где i < j, 2 <= k <= N (всего (j - 1) * (N - 1) точек). Т.е. кол-во точек пересечения, ктр лежат на отрезках исходящих из n1 будет равно:
(1 + 2 + ... + (M - 1)) * (N - 1) = (M * (M - 1) / 2) * (N - 1)

Далее обощаем и получаем общую формулу:
f(N, M) = M * (M - 1) / 2 * (N - 1) + f(N - 1, M)
Дальше просто разворачиваем формулу для f(N - 1, M) и т.д.
f(N, M) = M * (M - 1) / 2 * (N - 1) + f(N - 1, M) =
M * (M - 1) / 2 * (N - 1) + M * (M - 1) / 2 * (N - 2) + f(N - 2, M) =
M * (M - 1) / 2 * (N - 1) + M * (M - 1) / 2 * (N - 2) + .. + M * (M - 1) / 2 * 1 =
M * (M - 1) / 2 * N * (N - 1) / 2.
f(N, M) = N * (N - 1) * M * (M - 1) / 4
Реализация:

https://gist.github.com/unilecs/63995452e678b8f87b08a3ed1716324e
Test: