Можно источник задачи?
Я знаю решение за
и вроде как за
Это задача 415 из Project Euler. А что у Вас за решение?
Ключевая идея - считать от обратного, то-есть от общего числа отрезков в квадрате отнять количество тех, которые содержат в себе ровно 2 целочисленные точки. Я, кстати, очень удивился, что никто её не предложил, а полезли все в страшные дебри=)
И так, с общим числом отрезков понятно:
.
Нужно найти количество отрезков с двумя точками.
Заметим, что каждый такой отрезок задаётся вектором
, где
и
- взаимно простые числа, одно из них, например,
может быть отрицательным. Также, очевидно, что для каждого такого вектора существует
отрезков в квадрате, содержащих ровно 2 точки.
И вот мы уже получили решение за
или за
- перебрать все пары взаимно простых, ну и посчитать искомое количество.
Теперь нужно ускорить этот подсчёт, чтоб не перебирать все пары.
Возьмём число
, по известному свойству, количество чисел, взаимно простых с
и меньших его равно
. А их сумма равна:
. Таким образом, нам осталось просуммировать
. (и не забыть учесть единичные отрезки, и пары с отрицательны
).
А это можно сделать за
, если перебирать
и считать
в лоб, либо если запустить рекурсию, и получать все натуральные числа из простых, что тем самым даст возможность поддерживать значение
и изменять на каждом шаге за
. Итого
. Но, увы, тут возникает сложность для
, ибо мы не сможем получить достаточно большие простые числа.
Конечно, алгоритм ещё можно попробовать улучшить, или даже свернуть формулу.
п.с.
Вот, как пример,
:
http://ideone.com/OzPUrRп.с2
Прочитал я ту задачу, как-то там ещё сложнее, чем то, что вы написали=)