珠子饰品算法

时间:2014-04-27 18:26:14

标签: algorithm graph

我一直试图理解这个问题。有人可以帮助理解这个问题吗?

=============================================== ================================

有N种颜色的珠子。你有第i种颜色的双珠。你想通过将所有珠子连​​接在一起来制作装饰品。您可以使用以下算法创建装饰:

步骤#1以任何顺序排列所有珠子,使相同颜色的珠子放在一起。

步骤#2装饰物最初仅由排列中的第一个珠子组成。

步骤#3按顺序对每个后续珠子,将其连接到装饰物中相同颜色的珠子。如果没有相同颜色的珠子,它可以连接到装饰品中的任何珠子。

即使它们具有相同的颜色,所有珠子都是不同的。按照上述算法可以形成多少个不同的饰物?如果两个珠子在一种配置中通过螺纹连接而在另一种配置中没有连接,则认为两个饰品是不同的。

更新/澄清

将珠子形成为树而不是直线。任何数量的珠子都可以连接到珠子上。

输入:

第一行包含测试用例的数量T.T测试用例如下。每个测试用例在第一行包含N - 珠子的颜色数量。下一行包含N个整数,其中第i个整数bi表示第i个颜色的珠子数。

输出:

输出T行,每个测试用例一行。所有答案都应以模块1000000007输出。

约束:

1 <= T <= 20

1 <= N <= 10

1&lt; = bi&lt; = 30

示例输入:

5 2 2 1 2 2 2 1 4 2 3 1 五 1 1 1 1 1 样本输出:

2 4 16 9 125 说明:

对于第一种情况:让我们标记珠子A1,A2和B1。最初,它们可以以4种方式排列 - “A1,A2,B1”,“A2,A1,B1”,“B1,A1,A2”和“B1,A2,A1”。

对于前两种布置中的每一种,可以以两种方式形成装饰物(A1-A2-B1或B1-A1-A2来自第一种,A2-A1-B1或B1-A2-A1来自第二种)一个)。

对于最后两种安排中的每一种,可以单向形成装饰物。

然而,在总共6种可能的饰物中,只有2种独特的饰物:A1 - A2 - B1和A2 - A1 - B1。

对于第二个测试案例:可能的独特饰品是A1 - A2 - B1 - B2,A1 - A2 - B2 - B1,A2 - A1 - B1 - B2和A2 - A1 - B2 - B1。

对于第三个测试用例,可能更容易看到4个顶点上只有2种类型的图形:路径或星形。不难看出有12条路径和4颗星(解释礼貌:zlangley)

对于第五个测试用例,有很多人声称可能的方式总数是5!/ 2 = 60,答案是125.那么,你再次认为它是一颗树。这意味着一种可能的安排。将A视为根节点并具有两条边(A-B和A-C)。现在,将B视为具有两条边(B-D和B-E)的子根节点。这是一种可能的珠子形成。

=============================================== ==================================

PS:我得到这个问题的比赛现在结束了,我只是想了解这个问题。 (https://www.hackerrank.com/challenges/beadornaments

1 个答案:

答案 0 :(得分:2)

让我试着重新解释这个问题:模拟一个给定的大素数,有多少无根树涉及n个成对不同的节点(珠子),受限制,对于给定分区的每个部分(着色)节点,由这些节点引起的子图是连接的(即,它是一棵树)?

这种树由颜色内和颜色间边缘组成。此外,前者的选择不会影响后者的有效选择集,反之亦然。对于每种颜色,内部颜色边缘的选择依次是独立的。对于具有k个节点的颜色,可能性的数量是Cayley's formula的k ^(k-2)。将这些加在一起。

要确定颜色间边缘的可能性数量,请使用Kirchhoff's matrix tree theorem计算图形的生成树数,其中每种颜色都是一个节点,并且颜色之间有k1 * k2个边缘k1珠子和具有k2的另一种颜色,即在每个颜色收缩的珠子上的完整图表中的生成树的数量。由于答案是以大质数为模计算的,因此对于强多项式时间的算法,可以通过例如高斯消元来完成行列式计算。