根据OEIS,我们有:
G(1) = 1
G(n+1) = 1 + G(n + 1 - G(G(n)))
如果您生成序列一段时间,您会注意到重复k
次数的组的大小为k * G(k)
. 例如,重复 2 次的组的大小是多少?2 * G(2) = 4: 2 2 3 3
. 那些重复3次的?3 * G(3) = 6: 4 4 4 5 5 5
(6
重复4
几次)。
请注意,总和ig(k) = sum i * G(i), i <= k
为您提供了重复 1、2、...、k
次的组的大小,因此它告诉您重复k
次数的组在哪里结束。
这个 OEIS 公式也很有帮助:
for G(1) + G(2)+ ... + G(n-1) < k <= G(1) + G(2) + ... + G(n) = sg(n)
we have G(k) = n
使用它,您只需计算几个 的值G
就可以找到大量的值。例如,让我们找到G(10^6)
:
首先,找到k
这样的k*G[k] < 10^6 <= (k + 1)*G[k + 1]
。这将有助于告诉您该组G[10^6]
所在的位置,以及它的价值。
找到这k
将意味着它G(10^6)
在一组 size 中k + 1
。
我使用这个 C++ 程序来找到这个值:
int g[200000], ig[200000];
int main()
{
g[1] = 1;
ig[1] = 1;
for (int i = 2; i < 1000; ++i) {
g[i] = 1 + g[i - g[g[i - 1]]];
ig[i] = ig[i - 1] + i * g[i];
}
int k = 1;
while (ig[k] < 1000000) // 10^6
{
++k;
}
cout << k - 1 << ' ' << ig[k - 1] << endl;
cout << k << ' ' << ig[k] << endl;
return 0;
}
这使:
k k * G[k] k + 1 (k + 1) * G[k + 1]
263 998827 264 1008859
现在您需要使用 精确定位确切的组sg
:您可以通过使用相邻值n
之间的插值在 OEIS 公式中找到 。ig
这意味着:
G(10^6) = sg(k = 263) + (ig(k + 1 = 264) - ig(k = 263)) / (k + 1 = 264)
获得答案的确切解决方案和您需要计算的值的数量留作练习,询问您在此过程中是否有任何问题。