Math 按词法顺序求和到给定数字的第n个千人组
A要求按照词汇顺序(从低到高)找到答案 a+b+c+d..=x 其中a,b,c,d…是介于0-999和x之间的任意数目的整数 是一个固定整数 给出了一个答案,该答案使用python完全有效地计算了这一点 然而,对于非常大的数量,循环可能需要几年才能完成 例如,庞大的数字:Math 按词法顺序求和到给定数字的第n个千人组,math,numbers,partition,Math,Numbers,Partition,A要求按照词汇顺序(从低到高)找到答案 a+b+c+d..=x 其中a,b,c,d…是介于0-999和x之间的任意数目的整数 是一个固定整数 给出了一个答案,该答案使用python完全有效地计算了这一点 然而,对于非常大的数量,循环可能需要几年才能完成 例如,庞大的数字: 304153525784175759 是x=2700的解决方案,因为三人组加起来就是2700 304+153+525+784+175+759=2700 然而,通过算法循环得到等于这个数字的第n个解需要几个月或几年的时间 有没有
304153525784175759
是x=2700
的解决方案,因为三人组加起来就是2700
304+153+525+784+175+759=2700
然而,通过算法循环得到等于这个数字的第n个解需要几个月或几年的时间
有没有办法直接计算第n个解?也就是说,对于一个已知的解决方案,计算有多少个解决方案比这个解决方案少。编辑:这篇文章只讨论如何在给定特定解决方案的情况下找到下一个解决方案
OP还要求:
- 给定索引
查找n
th解决方案,而无需生成所有先前的解决方案n
- 给定一个解决方案
,找出存在多少较小的解决方案a
start = 304153525784175759 # start = '304,153,525,784,175,759'
x = 2700
grouping = 3
max_in_group = 10**grouping - 1
if start is not None:
if isinstance(start, str):
a = [int(s) for s in start.split(',')[::-1]]
else: # suppose start is a large integer
a = []
while start != 0:
a.append(start % (max_in_group+1))
start //= max_in_group+1
else: # no start value given, start with the smallest
a = [x]
如果您将此预处理到的其余部分,您将获得以下输出:
304,153,525,784,175,759
304,153,525,784,176,758
304,153,525,784,177,757
304,153,525,784,178,756
304,153,525,784,179,755
304,153,525,784,180,754
304,153,525,784,181,753
304,153,525,784,182,752
304,153,525,784,183,751
304,153,525,784,184,750
304,153,525,784,185,749
304,153,525,784,186,748
...
下面是一种查找解决方案索引的方法(或:有多少个较小的解决方案)。该守则分为两部分:
- 对于给定的和
,找出一些固定数目的x
组有多少个解。这是一个递归函数。基本上,对于n
组和sumn
,对于从0到999的所有k,总结有x
组和sumn-1
的解决方案的数量。由于递归函数通常使用相同的值调用,因此结果存储在记忆词典中,以便下次立即使用x-k
- 使用此函数可计算存在多少较小的解决方案。这是一种类似的求和方法。例如,对于6组,从
开始,计算有多少5组在304
之后开始,并求和到303
,将以x-303
开始并求和到302
的5组数相加,等等。然后,以x-302
为开始,查找在304153
之后开始的4组数量,并求和到304152
,以此类推x-304-152
如果不是(0)什么是第一个解决方案?从
n
-th解决方案到n+1
-th解决方案的规则是什么?@HighPerformanceMark不确定。链接问题中有一个循环算法。不确定如何将其分解为单个公式这是枚举组合学中一个非常重要的问题。你是必不可少的ly请求从秩(索引)开始的unrank
函数对于那个等级的组合对象。也许是一个更好的提问的地方。@johncolman在那里尝试过。但他们不知道。这是一个非数学操作,所以可能是johanC的解是最好的解。这给出了它是多少个解吗?也就是说,这是从最低到最高的25000个解吗?不,找到确切的有多少个早期解是这是一个更棘手的问题。同时,给定索引,找出对应于它的解决方案。可能有一个递归公式?是的,确实如此。当前循环需要几个月甚至几年才能完成大的值。我的主要问题是“给定解a,找出存在多少较小的解”好的,谢谢。我想也许计算机算法是“数字总和:2700”的唯一方法-有没有办法改变这个数字?它只是输入的三个数的总和。否则,你不能给输入的数字加索引。如果你替换x=sum(a)
通过另一个值,该函数仍能正确计算小于输入的解决方案数。
number to test: 304,153,525,784,175,759
numbers should sum to: 2700
number of smaller solutions: 180232548167366
index of this solution: 180232548167367