def solution(l): edges = {n : {'count': 1, 'multiple': set(), 'divisor': set()} for n in set(l)} for i in range(len(l)): x = l[i] if edges[x]['count'] > 1: continue for j in range(i+1, len(l)): y = l[j] if x == y: edges[x]['count'] += 1 elif x > y and x % y == 0: edges[x]['divisor'].add(y) edges[y]['multiple'].add(x) elif y > x and y % x == 0: edges[x]['multiple'].add(y) edges[y]['divisor'].add(x) result = 0 for x in edges: # 1. (d, x, m) result += len(edges[x]['divisor']) * len(edges[x]['multiple']) # 2. (d, x, x) (x, x, m) if edges[x]['count'] >= 2: result += len(edges[x]['divisor']) + len(edges[x]['multiple']) # 3. (x, x, x) if edges[x]['count'] >= 3: result += 1 return result tests = [ ([1, 1, 1], 1), ([1, 2, 3, 4, 5, 6], 3), ([2, 3, 4], 0), ([1, 1, 2, 3, 4, 5, 6], 8), ([3 for i in range(2000)], 1), ([i for i in range(1, 2000)], 40777), ] for i, o in tests: result = solution(i) print(i, result == o, result, o)