📅  最后修改于: 2023-12-03 15:26:27.640000             🧑  作者: Mango
有一个整数N,现在我们需要找到一个最小的正整数S,使得N是S的因数或者S的阶乘的因子。
对于一个正整数N,我们可以从小到大枚举S,验证N是否是S的因数或者S的阶乘的因子。但是这种方法的时间复杂度比较高,我们需要寻找一种更加高效的算法。
对于S的因数问题,我们可以从小到大枚举S的因数,检查N是否能够整除该因数。如果存在一个因数可以被N整除,那么我们就找到了最小的S。
对于S的阶乘问题,我们可以考虑对于每个质因子,找到其在N中的出现次数和在S!中的出现次数,如果后者大于等于前者,那么N就是S!的因子。对于一个数S,其质因子的出现次数最多为log(S),因此我们只需要枚举小于log(N)的正整数,并检查N是否是其阶乘的因子即可。
import math
def find_min_S(N):
# 查找因子
for i in range(1, N+1):
if N % i == 0:
return i
# 查找阶乘的因子
for i in range(2, int(math.log(N))+2):
count = 0
for j in range(2, i+1):
while i % j == 0:
count += 1
i //= j
if count > 0 and N % int(math.pow(j, count)) == 0:
return int(math.pow(j, count))
return None
print(find_min_S(24)) # 3
print(find_min_S(120)) # 5
print(find_min_S(720)) # 6
print(find_min_S(1000)) # 125