出于兴趣,我试图解决Euler项目(数字总和序列)的“最近”类别中的问题 。但是我想不出一种有效解决问题的方法。问题如下(在最初的问题序列中,开始时有两个问题,但不会改变序列):
的数字和序列是1,2,4,8,16,23,28,38,49 ....其中序列的术语是和数字序列中它前面。找到序列的项。
天真的解决方案无法实现,因为它需要大量时间。我试图减少的问题,以矩阵幂的情况下(这将花费的时间量),但不能想出这样的复发拟合线性标准作为复发,这种序列是相当特有。可以看出,该序列由重复控制:
其中是序列的术语和是给定的自然数作为数(例如数字输入返回总和时的功能。)。我的第二种方法是尝试在序列中找到某种模式。可以看出,序列的前几项可以写成
a_1 = 1
a_2 = 1 + d( 1 )
a_3 = 1 + d( 1 ) + d( 1 + d( 1 ) )
a_4 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) )
a_5 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) + d( 1 + d(
1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) )
从上面的模式可以看出,可以通过以下方法生成序列的项:
- 写出 ,并在其间加上符号。
- 保留第一个,然后 在接下来的2 0项上应用函数d,然后在接下来的2 1项上应用函数d,然后在接下来的2 2项上应用函数d,依此类推。
- 然后将上述方法递归应用于所应用的每个函数的参数。
例如,如果n = 3,我们执行以下操作:
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + d( 1 ) + d( 1 + 1 ) + d( 1 + 1 + 1 + 1 )
1 + d( 1 ) + d( 1 + d(1) ) + d( 1 + d( 1 ) + d( 1 +d( 1 ) ) )
通过动态编程,我可以使用上述方法在时间O (l o g (2 10 15))中生成项,这再次没有天真的解决方案好。
编辑1
可以观察到的另一件事是。例如d (a 6)= d (23 )= d (32 )= 5。但是我无法利用这一点。我再次尝试找到线性递归关系(用于矩阵求幂),但是我找不到它。
编辑2
PS:我知道不建议向Euler项目寻求解决方案。但是我只想一个新的方向或暗示,因为我过去几天一直在圈子里移动。如果那也不可接受,那么我可以在建议的情况下删除问题。
You are given a106 = 31054319.
在原始的Euler问题中是一个提示。