N(村数)的居民什么时候再见面?

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

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

示例:

示例 1:

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

示例 2:

INPUT: 10 14 15 30 21 5 40 4 8 -> OUTPUT: 840 0 (所有村民会再次见面840 天)。

示例 3:

INPUT:25065 3575 12305 88590 1758 -> OUTPUT: 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

如果你把问题改成有偏移量("the villagers of village 1 were in the city 10 tens ago"),顺便说一句,你可以使用中国剩余定理。

编辑:

至于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。 2 的效能 1 和 5 的效能 1 都只找到一次,所以乘积保持 840。
  • 除 2 的效力 2 外,所有其他数字均如此,如 4 = 2^2
  • 但是因为我们也有 2 的 3 效能,所以这无关紧要,我们仍然使用 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,我们会失去一个 2 的 3 和 3 的 2。第一个无关紧要,因为它存在不止一次,第二个也是,因为有更高的 3 ( ^5).
  • 如果我们去掉74,同样成立
  • 然而,如果我们取出 75,我们发现它的效力为 2 of 5 是单数,我们可以将其取出。 (2^3)*(3^5)*37 = 71928,这是我们新的最小值
  • 296 再次无关紧要,因为 2^3 被发现两次,37^1 也被发现。

因此,我们得到 N-1 个村庄的下一次聚会是在 71928 天之后,除了 75 个以外的所有人都在场。

有帮助吗?