【发布时间】:2014-01-24 23:40:34
【问题描述】:
考虑这个挑战:
给定两个数字
A和B,您可以通过多少种方式选择B不同的素数,其中每个素数应小于或等于A(<= A)。由于数字可能很大,请提供您的答案 mod 65537。
例如
如果A = 7 和B = 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 个素数。