Учитывая N, L и R, мне нужно найти количество чисел в диапазоне [ L, R], которые делятся по крайней мере на одно простое число в диапазоне [1, N].Эффективный алгоритм для подсчета чисел в диапазоне [L, R], которые делятся по крайней мере на одно простое число в диапазоне [1, N]
Ограничения:
1<=N<=50
1<=L,R<=10^18
Пример:
N=5
L=1
R=10
ответа = 8
Пояснение:
Простые числа в диапазоне [1,5] являются {2,3, 5}. Числа в диапазоне [1,10], которые делятся по крайней мере на один из простых чисел в {2,3,5}, являются {2,3,4,5,6,8,9,10}.
Мой код в Python дает ошибку «Превышен лимит времени», поскольку ограничения слишком высоки!
Мой код:
import math
def primes_till_n(n):
sieve=[True]*n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
return [2]+[i for i in xrange(3,n,2) if sieve[i]]
n,l,r=map(int,raw_input().split())
primes=primes_till_n(n+1)
ct=0
for i in xrange(l,r+1):
for j in primes:
if i%j==0:
ct+=1
break
print ct
Этот вопрос от Globalsoft найма вызов, Hackerearth и вызов закончен сейчас и редакция не предоставляется!
Сообщите нам ваш код! Это вызов? Если да, то вы ожидаете, что мы разрешим его для вас, даже не показывая ваши собственные попытки? – MrSmith42
Можете ли вы поделиться ссылкой на проблему? Просто чтобы убедиться, что это не победный конкурс. – halfo
См. Здесь полную противоположность этому вопросу: https://github.com/niklasb/contest-algos/blob/master/number_theory.cpp#L90 Это основное применение принципа исключения включения. –