【问题标题】:Python challenge: distinct combination of prime numbers in a given rangePython挑战:给定范围内素数的不同组合
【发布时间】:2014-01-24 23:40:34
【问题描述】:

考虑这个挑战:

给定两个数字AB,您可以通过多少种方式选择B 不同的素数,其中每个素数应小于或等于A (<= A)。由于数字可能很大,请提供您的答案 mod 65537。

例如

如果A = 7B = 2,那么:
所有素数<= A 都是{2, 3, 5, 7},答案将是6{2, 3} {2, 5} {2, 7} {3, 5} {3, 7} {5, 7}

我已经创建了这个解决方案:

from math import factorial
from math import fmod 

def nPk(n,k):
    return int( factorial(n)/factorial(n- k))  

def is_prime(a):
    for i in range(2,a):
        if a % i ==0:
            return False
    return True

def distinct_primes(A):
    primes = []
    for i in range(2,A):
        if is_prime(i):
            primes.append(i)
    return len(primes)

def fct(A, B):
    return nPk(distinct_primes(A),B)

#print fct(59,5)% 65537
print fmod(fct(69,8), 65537)

但是,我没有得到正确的答案!我在这里想念什么?

【问题讨论】:

  • 顺便说一句,如果您使用已知的primes 搜索is_prime,您可以显着加快搜索素数的速度。见this answer
  • @9000 你的意思是this answer?这是您链接到的代码的调整,速度提高了 1.3 倍,并且占用了 O(sqrt(n/log n)) 额外空间而不是 O(n),产生 n 个素数。

标签: python primes


【解决方案1】:

Ionut 关于包容性问题是正确的!
除此之外,您应该将 nPk 定义更改为:

def nPk(n,k):
    return int( factorial(n)/(factorial(n- k) * factorial(k)))

【讨论】:

  • 编辑的函数在某些情况下会失败,例如 n = 334 和 k = 25 我不明白为什么,请你再看看
【解决方案2】:
for i in range(2,A):

应该是

for i in range(2, A+1):

因为你必须考虑所有素数 A.

【讨论】:

    【解决方案3】:

    alfasin 是正确的;问题是您选择素数的顺序无关紧要。因此,您希望使用组合而不是排列。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多