Q: Даны A, B и K. Найдите все числа от A до B (включительно), которые имеют K DISTINCT простых множителей. Вот что я сделал. Я реализовал решето Эратосфена и вычислил все простые числа до верхней границы A, B. Затем я перехожу к поиску того, какое из этих простых чисел является множителем чисел между A и B. Если количество различных простых чисел равно K, я увеличиваю счет. Проблема, с которой я сталкиваюсь, - это время. Даже после внедрения сита требуется 10 секунд, чтобы вычислить ответ на 210000,1 (числа от 2 до 100000, которые имеют 1 отдельный простой фактор) вот мой код
import math
#Sieve of erastothenes
def sieve(n):
numbers=range(0,n+1)
for i in range(2,int(math.ceil(n**0.5))):
if(numbers[i]):
for j in range(i*i,n+1,i):
numbers[j]=0
#removing 0 and 1 and returning a list
numbers.remove(1)
prime_numbers=set(numbers)
prime_numbers.remove(0)
primes=list(prime_numbers)
primes.sort()
return primes
prime_numbers=[]
prime_numbers=sieve(100000)
#print prime_numbers
def no_of_distinct_prime_factors(n):
count=0
flag=0
#print prime_numbers
for i in prime_numbers:
#print i
if i>n:
break
if n%i==0:
count+=1
n=n/i
return count
t=raw_input()
t=int(t)
foo=[]
split=[]
for i in range (0,t):
raw=raw_input()
foo=raw.split(" ")
split.append(foo)
for i in range(0,t):
count=0
for k in range(int(split[i][0]),int(split[i][1])+1):
if no_of_distinct_prime_factors(k)==int(split[i][2]):
count+=1
print count
Есть какие-нибудь советы по его дальнейшей оптимизации?