"""
Рассмотрим дробь n/d, где n и d являются положительными целыми числами.
Если n<d и НОД(n,d) = 1, то речь идет о сокращенной правильной дроби.

Если перечислить множество сокращенных правильных дробей для d ≤ 8 в
порядке возрастания их значений, получим:
1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5,
5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
Нетрудно заметить, что данное множество состоит из 21 элемента.
Из скольки элементов будет состоять множество сокращенных
правильных дробей для d ≤ 1 000 000?
"""
# TODO решение занимает много времени, нужно как то оптимизировать код
import time
from math import sqrt
res = 0
start = time.time()
for num in range(2, 1000001):
    n = num
    for div in (div for div in range(2, int(sqrt(num) + 1)) if not n % div):
        while not n % div:
            n //= div
        num -= num // div
    i = {1: num}
    res += i.get(n, num - num // n)

print(res, time.time() - start)
