Python 计算[1,R]范围内可被[1,N]范围内至少一个素数整除的数字的有效算法

Python 计算[1,R]范围内可被[1,N]范围内至少一个素数整除的数字的有效算法,python,algorithm,math,range,primes,Python,Algorithm,Math,Range,Primes,给定N,L和R,我必须找到[L,R]范围内至少可被[1,N]范围内的一个素数整除的数的计数 限制条件: 1<=N<=50 1<=L,R<=10^18 答案=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=[

给定N,L和R,我必须找到[L,R]范围内至少可被[1,N]范围内的一个素数整除的数的计数

限制条件:

1<=N<=50
1<=L,R<=10^18
答案=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,挑战已经结束,没有提供社论

让素数数组包含的素数小于50。素数数组的大小将为15。您可以计算区间[L,R]中有多少数字可被复杂度为O(1)的数字整除(下面代码中的calculateInterval函数)。所以你应该对每一个必要的素数做同样的事情。但为了得到正确的结果,您应该执行包含排除。复杂性为O(2^P)。P是不大于N的素数。2^P最大值为2^15

    N, L, R, = map(int,raw_input().split())

    def calculateInterval(begin,end,number):
        return (end/number) - ((begin-1)/number)

    primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

    end = 0
    while end < 15:
        if primes[end] > N:
            break
        end += 1

    res = 0
    i = 1
    while i < (1<<end):

        cnt = 0
        num = 1

        for j in xrange(end):
            if (1<<j) & i:
                cnt += 1
                num *= primes[j]

        if cnt%2 == 1:
            res += calculateInterval(L,R,num)
        else:
            res -= calculateInterval(L,R,num)

        i += 1

    print res
N,L,R,=map(int,raw_input().split())
def calculateInterval(开始、结束、编号):
返回(结束/编号)-(开始-1)/编号)
素数=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
结束=0
当末端<15时:
如果素数[end]>N:
打破
结束+=1
res=0
i=1

而我(1向我们展示您的代码!这是一个挑战吗?如果是,您希望我们在不显示您自己的尝试的情况下为您解决问题吗?您可以分享问题链接吗?只是为了确保这不是一个持续的竞赛。请参阅此处,了解与此问题完全相反的内容:这是包含排除原则的基本应用。它看起来像是y您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只在海报已经尝试自己解决问题时提供帮助。展示这一努力的一个好方法是包含您迄今为止编写的代码,例如输入(如果有),预期输出和实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。请检查和。添加的代码。竞赛结束,未提供社论!
    N, L, R, = map(int,raw_input().split())

    def calculateInterval(begin,end,number):
        return (end/number) - ((begin-1)/number)

    primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

    end = 0
    while end < 15:
        if primes[end] > N:
            break
        end += 1

    res = 0
    i = 1
    while i < (1<<end):

        cnt = 0
        num = 1

        for j in xrange(end):
            if (1<<j) & i:
                cnt += 1
                num *= primes[j]

        if cnt%2 == 1:
            res += calculateInterval(L,R,num)
        else:
            res -= calculateInterval(L,R,num)

        i += 1

    print res