N(村庄数量)的居民何时再次见面?

When will the residents of N (number of villages) meet again?

本文关键字:何时再 见面 村庄      更新时间:2023-10-16

所以,这个问题是我过去遇到的一篇编程竞赛论文的一部分。给定一个数字N,代表市中心周围的村庄数量,第一个村庄的村民每x1到几天去城市购买一次物资,第二个村庄的村民每x2天去一次,依此类推。所有村民今天都在市中心聚会。我们被要求找出至少N-1个村庄的村民何时在同一天再次访问市中心!

例子:

示例 1:

输入 1: 1 2 3 4 5 6 7 8 9 10 ->输出:360 7 在上面的例子中,除了第7个村的村民之外,所有村民将在360天后再次见面。

示例 2:

输入: 1014 15 30 21 5 40 4 8 ->输出: 840 0 (所有村民将在840天后再次见面)。

示例 3:

输入:25065 3575 12305 88590 1758 ->输出:25845383485350 4(所以25845383485350后,除第4村的村民外,所有村民都会再次见面)。

是否有不使用递归的解决方案方法?谢谢!

你的问题本质上是最不常见的倍数。(如果一个城市的村民每5天访问一次,并且他们在第0天访问过,他们也会在第5天,10天,15天,第20天访问......这些显然是倍数。

因此,解决此问题的一个好方法是将数字拆分为素因数,并且每个素因数使用最大发现的效力。

使用示例 2:

10, 14, 15, 30, 21, 5, 40, 4, 8 =

2*5, 2*7, 3*5, 2*3*5, 3*7, 5 2^3*5, 2^2, 2^3->取最大效力:2^3*3*5*7 = 840

如果你把问题改成有偏移量("10 个村的村民在 10 个十年前在城里"),顺便说一下,你可以使用中国余数定理。

编辑:

至于N-1村庄的变体,请像这样:

再次构建素因数,但这一次,计算哪个素数的效力多久被发现一次。再次创建最大效力,然后遍历村庄,看看忽略该特定村庄的村庄需要多长时间才能见面。有了效力计数,你可以很容易地看到移除村庄的效果。

我认为知道这个想法就足以编写代码,但如果您需要我详细说明,请说出来。

详细阐述一下:

对于每个素数,存储发现哪个效力的频率。

使用示例 2:

10, 14, 15, 30, 21, 5, 40, 4, 8 =

2*5, 2*7, 3*5, 2*3*5, 3*7, 5 2^3*5, 2^2, 2^3
  • 对于 10 = 2*5,我们存储:
  • 2 具有效力 1 (x1)
  • 5 具有效力 1 (x1)

  • 对于 14 = 2*7,我们将其更新为:

  • 2 具有效力 1 (x2)
  • 5 具有效力 1 (x1)
  • 7 具有效力 1 (x1)

-最后>:

2
  • 具有效力 1 (x3)、2 (x1)、3 (x2)
  • 3 具有效力 1 (x3)
  • 5 具有效力 1 (x5)
  • 7 具有效力 1 (x2)

现在我们再次浏览整个列表,如果只找到一次,则取出当前的效力,然后查看其产品。我们保留此产品的最低限度。

我们使用整个产品初始化最小值,在本例中为 840。

  • 我们评估 10 = 2*5。效力 1 of 2 和效力 1 of 5 都只找到一次,因此产品保持 840。
  • 所有其他
  • 数字都成立,除了效力 2 of 2,如 4 = 2^2
  • 但是由于我们也有 3/2 的效力,这无关紧要,我们继续使用我们的 840。

让我们做我们自己的例子:72、74、75 和 296 = 2^3*3^2 2*37 3*5^2 和 2^3*37

->

  • 2 具有效力 1 (x1)、3 (x2)
  • 3 具有效力 2 (x1), 5 (x1)
  • 5 具有效力 2 (x1)
  • 37 具有效力 1 (x2)

直到所有村庄再次见面,我们必须等待(2^3)(3^5)(5^2)*37= 1798200 天

  • 如果我们去掉 72,我们会失去 3/2 的一个效力和一个 2 的 3。第一个是无关紧要的,因为它存在不止一次,第二个也是因为有更高的效力 3 (^5)。
  • 如果我们去掉 74,同样成立
  • 然而,如果我们去掉 75,我们发现它的效力 2 of 5 是单数,我们可以把它拿出来。(2^3)*(3^5)*37 = 71928,这是我们新的最小值
  • 296 再次无关紧要,因为 2^3 被找到两次,37^1 也被找到。

因此,我们得到下一次N-1村庄见面是在71928天之后,那时除了75个之外的每个人都在场。

这有帮助吗?