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:
输入: 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个之外的每个人都在场。
这有帮助吗?
- 何时在引用或唯一指针上使用移动语义
- 何时提供默认参数作为模板参数
- C++-明确何时以及如何调用析构函数
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 我提出什么条件才能再加5%的折扣
- 我需要分发哪些版本的可再分发文件
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 等待整个 omp 块完成,然后再调用第二个函数
- 如果非动态变量被指针引用,何时超出范围?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- QWidget::p aintEngine:不应再在 QTreeWidget 派生类中调用
- 何时定义QT_NO_CONTEXTMENU?
- 何时为派生类初始化 vptr?
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 指针的 C++ 动态数组 - 何时需要使用它?
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 变量的值何时可以在C++中意外更改?
- 调用方如何知道 VARIANT 中何时有十进制?
- 何时应在构造函数参数中使用 const C++?
- N(村庄数量)的居民何时再次见面?