- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一段时间以来,我一直在尝试理解这个问题。有人可以帮助理解这个问题吗?
============================================= ================================
有N种颜色的珠子。你有第 i 种颜色的 bi 珠子。您想通过将所有珠子连接在一起来制作装饰品。您可以使用以下算法创建装饰品:
步骤 #1 以任意顺序排列所有珠子,使相同颜色的珠子放在一起。
第 2 步装饰品最初仅由排列中的第一个珠子组成。
第 3 步 对于每个后续的珠子,将其连接到装饰品中相同颜色的珠子。如果没有相同颜色的珠子,可以将它连接到饰品中的任何珠子上。
所有珠子都是不同的,即使它们具有相同的颜色。按照上述算法可以组成多少种不同的饰品?如果两个珠子在一种配置中通过线连接,而在另一种配置中则没有,则认为两个装饰品不同。
更新/澄清
将珠子的形成想象成一棵树而不是一条直线。一个珠子可以连接任意数量的珠子。
输入:
第一行包含测试用例T的数量。后面是T个测试用例。每个测试用例在第一行包含 N - 珠子的颜色数。下一行包含N个整数,其中第i个整数bi表示第i种颜色的珠子数量。
输出:
输出 T 行,每个测试用例一行。所有答案都应以 1000000007 为模输出。
约束:
1 <= T <= 20
1 <= N <= 10
1 <= 双 <= 30
示例输入:
52个2 12个2 21个4个2个3 15个1 1 1 1 1示例输出:
24个169125说明:
对于第一种情况:让我们将珠子标记为 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 个顶点上只有两种类型的图:路径或星形。不难看出有12条路径和4颗星(解释礼貌:zlangley)
对于第五个测试用例,有很多人声称可能的方式总数是 5!/2 = 60 而答案是 125。一颗树。这意味着一种可能的安排是。将 A 视为根节点并具有两条边(A-B 和 A-C)。现在,将 B 视为具有两条边(B-D 和 B-E)的子根节点。这是一种可能的珠形成。
============================================= ==================================
PS:我得到这个问题的比赛现在已经结束,我只想了解这个问题。 ( https://www.hackerrank.com/challenges/beadornaments )
最佳答案
让我尝试重新表述这个问题:对给定的大质数求模,有多少无根树涉及 n 个成对不同的节点(珠),受制于以下约束:对于给定分区(着色)的每个部分节点,由这些节点导出的子图是连通的(即,它是一棵树)?
这样的树由颜色内和颜色间的边组成。此外,前者的选择不会影响后者的有效选择集,反之亦然。对于每种颜色,颜色内边缘的选择又是独立的。对于具有 k 个节点的颜色,可能性的数量是 k^(k-2) by Cayley's formula .将它们相乘。
要确定颜色间边缘的可能性数量,请使用 Kirchhoff's matrix tree theorem计算一个图的生成树的数量,其中每个颜色是一个节点,并且在具有 k1 珠子的颜色和具有 k2 的另一种颜色之间有 k1*k2 条边,即具有珠子的完整图形中的生成树数每种颜色都收缩。由于答案是以大质数为模计算的,对于强多项式时间的算法,行列式计算可以通过例如高斯消去法来完成。
关于algorithm - 珠饰算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23327244/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!