Потому, что текст задачи неоднозначен.
Задачу можно трактовать несколькими способами: Число, имеющее только нечётные делители. И общее кол-во этих делителей нечётно. В этом случае в ответе действительно получаем 2 числа, т.к. такое число может быть только нечётным. Если ты заменишь range(248015,251576) на range(248015,251576,2), то получишь два числа.Число, имеющее любые делители, но кол-во нечётных делителей этого числа нечётно. В этом случае в ответе 5 чисел, т.к. помимо двух нечётных чисел есть ещё три чётных числа, имеющих нечётное кол-во нечётных делителей.
Во втором случае задачу можно трактовать ещё двумя способами: Надо вывести кол-во и сумму только нечётных делителей.Надо вывести кол-во и сумму всех делителей, включая чётные.
import math
def odd_divs

: # возвращает только нечётные делители
while n % 2 == 0: n //= 2 # убираем все чётные делители
res = set()
for i in range(1, math.isqrt

+ 1, 2):
if n % i == 0: res |= {i, n // i}
return res
# Вариант 1 (число имеет только нечётные делители)
for i in range(248015, 251576, 2):
d = odd_divs(i)
if len(d) % 2: print(i, len(d), sum(d))
# Вариант 2.1 (число может иметь любые делители; сумма и кол-во только нечётных делителей)
for i in range(248015, 251576):
d = odd_divs(i)
if len(d) % 2: print(i, len(d), sum(d)) Без функций: import math
for k in range(248015, 251576):
n = k
while n % 2 == 0: n //= 2
d = set()
for i in range(1, math.isqrt

+ 1, 2):
if n % i == 0: d |= {i, n // i}
if len(d) % 2: print(k, len(d), sum(d)) import math
for n in range(248015, 251576, 2):
d = set()
for i in range(1, math.isqrt

+ 1, 2):
if n % i == 0: d |= {i, n // i}
if len(d) % 2: print(n, len(d), sum(d))