Разбор
Зафиксируем (например ) и найдем количество таких , что . Найдем значения , удовлетворяющие этому равенству. Ими будут . То есть любое , являющееся делителем , удовлетворяет равенству .
Количество таких для которых , равно количеству делителей числа . Поскольку , то остается найти количество всех делителей чисел от до . То есть следует найти сумму . Поскольку вычисление требует факторизации числа , то непосредственное вычисление указанной суммы потребует времени .
Посмотрим на сумму делителей по-другому. Среди делителей чисел от до единица будет встречаться раз, двойка раз и так далее (делитель будет встречаться раз). Количество искомых пар целых чисел равно
Указанную сумму можно найти за время .
Пример
При имеем следующие пары:
Количество пар равно
Реализация алгоритма
Читаем значение .
scanf("%d",&n);
Вычисляем ответ по формуле и выводим его.
s = 0; for(i = 1; i <= n; i++) s += n / i; printf("%d\n",s);
Java реализация
import java.util.*; class Main { public static void main(String[] args) { Scanner con = new Scanner(System.in); int n = con.nextInt(); int s = 0; for(int i = 1; i <= n; i++) s += n / i; System.out.println(s); con.close(); } }
Python реализация
Читаем значение .
n = int(input())
Вычисляем ответ по формуле и выводим его.
s = 0 for i in range(1,n+1): s += n // i print(s)