#357 = CIRCLE ( 'NONE', #49, 20.00000000000000355 ) ;
import itertools
def Gen(s, k, m, cur): # разбить S на K слагаемых от 1 до M
if m == 1:
if s != k: return
new_list = list(cur)
new_list.extend([1]*k)
yield from set(itertools.permutations(new_list))
#yield new_list # если порядок не важен
return
can_fit = min(s//m, k, (s-k)//(m-1))
need_take = max(0, s-k*(m-1))
new_list = list(cur)
new_list.extend([m]*need_take)
for i in range(need_take, can_fit+1):
yield from Gen(s-m*i, k-i, m-1, new_list)
new_list.append(m)
print(Gen(227, 52, 7, []))
kol+= m/j-(n-1)/j
то понял? Дальше разбиваем на 2 отдельные суммы. Одну с m, другую с n-1. kol += (m/j) +j*(m/j- m/(j+1)) ;
for(long long j=1;j<sqrt(m);++j){
kol += 2*(m/j) - m/(j+1) ;
}
for(long long j=1;j<sqrt(n-1);++j){
kol -= 2*((n-1)/j) - (n-1)/(j+1) ;
}
При парсинге не надо никаких регулярок - просто разбиваете строку на токены по пробелам, первый - ключ ("#20"), второй должен быть "=", а третий - это тип строки. если он "CIRCLE" и т.д., то берете соответствуюие 1-3 токена в данные (можно float получить через функцию stof(). Для CIRCLE у вас одна строка - ключ (5-ый токен) и float - радиус (6-ой токен). Для Axis выделяете 3 cтроки - ключа. Для Direction и Cartesian_point вы выделяете 3 float.
Потом проходитесь по всем CIRCLE, берете AXIS c нужным ключем, оттуда берете 3 строки c ключами для Cartesian Point и двух осей. Хотя оси, наверно, можно и игнорировать вообще. Потом в map-е для точки берете точку с нужным ключем. И вот у вас отверстие описывается радиусом, тройкой координат центра и двумя тройками координат осей. Оси, возможно, можно игнорировать. Все эти данные складывайте в новый класс. которые кладите в свой set. Оно автоматически дубликаты считать не будет. в конце его size() - это количество отверстий. И можно их все координаты вывести.