Python 试图找出是否存在一个总数为X的正因子,其中有K个不同的素因子

Python 试图找出是否存在一个总数为X的正因子,其中有K个不同的素因子,python,python-3.x,Python,Python 3.x,如果数字的形式为a^bc^de^f,其中a、c和e为素数,则因子总数为b+1d+1f+1 我用下面的方法处理这个问题- 如果X的素数因子大于或等于K,则有可能不是 我犯了一个小错误 如果存在这样的数字,我们必须打印1,如果不存在,则打印0 这些限制是— T您可以使用一个更简单的递归函数和一个计数器对象来确定是否至少有K个素数因子构成X 此函数不仅提供素数因子列表,还提供每个素数的计数幂。这些计数的总和是X的最大因子数 from collections import Counter def pr

如果数字的形式为a^bc^de^f,其中a、c和e为素数,则因子总数为b+1d+1f+1

我用下面的方法处理这个问题- 如果X的素数因子大于或等于K,则有可能不是

我犯了一个小错误

如果存在这样的数字,我们必须打印1,如果不存在,则打印0

这些限制是—
T您可以使用一个更简单的递归函数和一个计数器对象来确定是否至少有K个素数因子构成X

此函数不仅提供素数因子列表,还提供每个素数的计数幂。这些计数的总和是X的最大因子数

from collections import Counter 
def primeFactors(N):
    for f in range(1,int(N**0.5)+1,2): # stepping by 2 gives a 30% speed-up
        if f==1: f=2   
        if N%f==0:
            return Counter([f]) + primeFactors(N//f)
    return Counter([N])

X = 368640000
K = 21
result = 1 if sum(primeFactors(X).values())>=K else 0

print(result) # 1
在我的笔记本电脑上运行1000个随机测试用例只需0.16秒。如果所有1000个测试用例的最大素数X=99999937低于10^9,则最坏的情况需要1.06秒

[编辑]以下是使用简单字典的解决方案的变体。这是一个多一点的代码,但具有与计数器对象相同的性能

def primeFactors(N):
    for f in range(1,int(N**0.5)+1,2):
        if f==1: f = 2
        if N%f==0:
            result    = primeFactors(N//f)
            result[f] = result.get(f,0)+1
            return result
    return {N:1}
[EDIT2]这是原始代码的优化版本

以下是我所做的优化:

删除了不必要的逻辑和条件,例如X>=2**K 修正了2×2步进范围不起作用的问题,在循环中i+=2不会使其步进2。 使因子循环在平方因子i超出剩余X时中断,而不是始终循环到原始X的平方根。 当达到K目标时,也会中断循环。 删除了处理prime=2的特殊代码。 确保只使用整数算术//而不是/ 使用i x i
有了这些变化,计算的速度几乎与primeFactors函数的速度一样快,大约慢50%。

T是测试用例的总数。我编辑我的帖子是为了纠正你指出的错误。你能解释一下反陈述的作用吗?我对python比较陌生,所以不熟悉内置程序。有没有办法在不使用计数器对象的情况下在时间限制内执行它?计数器对象是字典的变体。它的形式是{Key:count},覆盖了一些算术运算符,通过加/减公共键的计数将这些字典组合在一起。明白了。谢谢你的帮助。结果表明,我的X>=2**K语句导致了程序中的TLE。移除它,它工作得很好。再次感谢
def primeFactors(N):
    for f in range(1,int(N**0.5)+1,2):
        if f==1: f = 2
        if N%f==0:
            result    = primeFactors(N//f)
            result[f] = result.get(f,0)+1
            return result
    return {N:1}
def OP(X,K):
    if K == 0: return int(X==1)
    if K == 1: return int(X>=2)
    for i in range(1,X,2):  # stride by two until break
        if i==1: i=2        # handle first prime (2)
        while not X % i:    # reduce X and K for prime factors
            X //= i            # X becomes other factor in X = i * X'
            K  -= 1            # one less prime factor to find
        if K<1 or i*i>X:
            break           # break when max prime reached (or K primes)
    return int(K<=0)