【问题标题】:How to find a math solution for solving a task? [closed]如何找到解决任务的数学解决方案? [关闭]
【发布时间】: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 好吧,我可能会在这里要求很多,但我想我希望对此有一个逐步的思考过程。但我很想知道如何使用这些公式变得更好,也许我可以从哪里了解这些东西。

标签: python math primes


【解决方案1】:

这里是部分代码的简要总结。

给定的代码中有两个主要思想。第一个想法是,给定一个正整数num(不一定是素数),从numStartnumEnd 范围内的数字计数可以被num 整除

numEnd//num - (numStart-1)//num

这是因为从1numStart 可被num 整除的数字是(numStart-1)//num,从1numEndnumEnd//num。 (我会让你弄清楚这些公式如何正确处理这些范围的结束值。)

这是第二个想法。该公式适用于给定列表中的每个素数。但问题要求计算该列表中可被“至少一个素数”整除的范围内的数字。如果我们只是将每个素数的计数相加,我们将多次计算可被多个素数整除的数字。处理这些多重计数的标准方法是Inclusion–exclusion principle。如果你对这类问题感兴趣,你应该阅读那篇文章。代码行

for j in range(1,numOfPrimes+1):
    for c in combinations(primes, j):

使c 成为素数列表的非空子集。我上面给你的公式用于查找子集中每个素数乘积的计数,并且乘以因子 (-1)**(len(c)+1) 以进行正确的包含/排除。然后添加所有这些产品。如果您不理解最后一部分,请阅读包含排除文章。我应该补充一点,基本数论告诉我们,当且仅当素数的乘积除以该数字时,不同素数的成员集都可以除以该数字-这就是为什么“素数”限制存在于问题中的原因。

至于这个人是如何得出这个结论的,计算机科学已经表明,没有保证可以找出解决问题的算法的方法。问题解决者只是利用他们的知识、经验、创造力和毅力继续前进,直到问题得到解决。 George Polya 的How to Solve It 一书是关于如何解决问题的经典之作。我向你强烈推荐这本书——它是平装本,而且很便宜。

【讨论】:

  • 这太棒了,谢谢!也感谢您的书籍​​推荐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
相关资源
最近更新 更多