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

2024-09-29 01:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

限制条件:

1<=N<=50
1<=L,R<=10^18

示例:

^{pr2}$

答案=8

说明:

在[1,5]范围内的质数是{2,3,5}。 [1,10]范围内可被{2,3,5}中至少一个素数整除的数是{2,3,4,5,6,8,9,10}。在

我用Python编写的代码由于约束太高而出现“timelimitexceeded”错误!在

我的代码:

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招聘挑战,HackerThreath,挑战已经结束,社论不提供!在


Tags: 答案代码in示例forif条件素数
1条回答
网友
1楼 · 发布于 2024-09-29 01:29:25

让素数数组包含小于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

相关问题 更多 >