不同素数分区的数目
Number of distinct prime partitions
可能重复:
一个数字作为它的素数部分
我有一个家庭作业,很难,我必须得到给定数字的所有不同的素数分区。例如,数字7有五个不同的素数分区(或者用五种不同的方式表示它的两个素数分区(:
- 5+2
- 2+5
- 3+2+2
- 2+3+2
- 2+2+3
正如你所看到的,在素数的情况下,这个数本身被排除在外。我不需要打印所有不同的分区,只需要打印它们的数量。
所以我对此有点不知所措。我一直无法生成任何代码,但我认为我应该从动态编程的角度来处理这个问题。我只是想得到一些提示。有人有主意吗?提前谢谢。
输入的最高数字是100。此外,程序的运行时间不能超过1秒,内存限制为128MB。
要解决这个问题,需要结合三个想法:
假设给定的数字是n:
-
找到所有小于n的素数,如图所示。
-
根据素数数组和n动态计算子集和。这里和这里都有一些提示
-
然后,计算从第二步得到的每个答案的不同排列数,如下所示。
当然,这只是一个暗示。但是,它应该对编写最终代码有很大帮助。
因此,以提示的形式而不是答案:
- 正如其他地方所说,你可以预先计算素数
- 您可以重用较小数量的结果吗?那么,假设你知道5的实际排列,这有助于你找到7的任何实际排列吗
- 结果有任何结构吗?如果有,你能使用这个结构来避免重复计算吗?例如,你列出了数字7的5个排列,但这些排列之间存在一些相似性——这是一种普遍趋势吗?它是什么
- 假设你找到了内部结构,可以使用较小的结果来帮助找到较大的结果,你能同时做到这两件事吗?你能完全避免存储完整的中间结果吗
- 最后,您需要列出每个有序组合还是只返回有序组合的编号?您可以在这里保存计算
不幸的是,这里的暴力无法得到太多改进。你绝对应该做的一件事是用埃拉托斯尼筛来预先计算所有素数,直到给定的数字。之后,给定一个数字N递归地打印它的所有分区,其中最小的素数是连续的素数列表中的每个素数(记住让它是最小的一个,这样你就不会重复分区(。
EDIT:在知道您只需要知道分区的计数之后:最好的解决方案是使用动态编程。同样,您需要在一个具有二维mem[MAX_SIZE][MAX_SIZE]
的数组中进行记忆,第一个索引是您正在计算解决方案的数字,第二个索引是应该用于分区的最小素数的索引。
你可能想在维基百科上查看分区的数学,特别是关于生成函数和限制分区生成函数的部分,大约在页面的一半。它提到了由特定被加数(由一组自然数T指定(组成的分区的生成函数。
设n的非阶相关素数分区的个数为R(n(。你可以从生成函数中导出R(n(,方法是取第n个偏导数w.R.t x,然后设置x=0。这可能并不容易。
需要注意的是:这些分区不依赖于顺序(即1+2和2+1仅算作一个分区(。
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 按字母顺序对C++问题中的子字符串索引进行分区
- 如何查找集合的所有分区 (C++)
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 使用指针在分区函数中实现随机分区点
- Coursera DSA 算法工具箱第 4 周第 2 个问题 - 分区纪念品
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 对多个(可能)重叠范围进行分区的最简单算法
- 如何在MacOS(sierra-catalina)上获取分区的可用空间
- 并行快速排序分区中的隔离错误
- C++年分区综述
- 实现 3 路分区以实现快速排序
- 访问映射中的分区向量
- 3路随机快速排序分区功能
- 如何确定2个URI(路径)是否属于同一分区或卷
- 根据 C++ 中的属性对对象类进行分区的优化方法
- 迭代快速排序方法的分区算法问题
- 找到分区数组的方法数量
- 如何使用第一个、中间和最后一个元素的中位数正确分区?
- C++分区算法