【发布时间】:2019-03-30 19:08:58
【问题描述】:
我正在寻找旧编码竞赛的解决方案,我想知道他们是如何找到这个解决方案的。
问题是这样的:计算 numStart - numEnd 范围内有多少唯一数可以被给定素数列表中的至少一个素数整除。
首先我想“当然,让我们创建一个遍历 numStart - numEnd 范围的 for 循环,并检查我是否可以用至少一个素数来划分我的迭代器”,这可行,但它太慢了。 ..那是我决定检查答案的时候。
我的代码:
# numStart: Start from number
# numEnd: End on number
# numOfPrimes: How many primes will we be checking
numStart,numEnd,numOfPrimes = map(int, input().split())
primes = list(map(int, input().split()))
# Input can look like this:
# >21 180 4
# >7 3 13 2
counter = 0
for testNum in range(numStart, numEnd + 1):
for prime in primes:
if testNum % prime == 0:
counter += 1
break
print(counter)
# Output would look like this:
# >118
解决办法:
from itertools import combinations
# numStart: Start from number
# numEnd: End on number
# numOfPrimes: How many primes will we be checking
numStart,numEnd,numOfPrimes = map(int, input().split())
primes = list(map(int, input().split()))
# Input can look like this:
# >21 180 4
# >7 3 13 2
result = 0
for j in range(1,numOfPrimes+1):
for c in combinations(primes, j):
num = 1
for x in c: num *= x
result += (-1)**(len(c)+1) * (numEnd//num - (numStart-1)//num)
print(result)
# Output would look like this:
# >118
我的问题真的是这个人是怎么想出来的?这是什么类型的数学,为什么会这样?
如果你至少能引导我朝着正确的方向前进,我将非常感激!
【问题讨论】:
-
没有神奇的公式或算法可以引导您找到数学问题的最佳解决方案。您通过尝试或思考可以提供帮助的线索来培养他们的直觉,但除此之外,我真的不知道您对这个问题的答案有何期望。
-
@ParitoshSingh 好吧,我可能会在这里要求很多,但我想我希望对此有一个逐步的思考过程。但我很想知道如何使用这些公式变得更好,也许我可以从哪里了解这些东西。