在这个问题中,我想找到所有公对数除数的总和。对形成如下:
给定数量N = 3
然后这对数字和公约数如下:
- (1,1)= 1,(1,2)= 1,(1,3)= 1
- (2,2)= 3,(2,3)= 1,
- (3,3)= 4(该对的公约数为1和3,因此总和为4)
所以答案是所有常见除数的总和,即11。
我在这里观察到某种类似的系列
for 1 : 1 1 1 1 ....
for 2 : 3 1 3 1 ....
for 3: 4 1 1 4 ....
for 4 : 7 1 3 1 7 .....
for 5 : 6 1 1 1 1 6 ....
for 6 : 12 1 3 4 3 1 12 ....
所以
使用上述模式可以解决这个问题吗? 如果是,请通过为此写一个伪代码来帮助我。
答案 0 :(得分:1)
在这个答案中,我假设您感兴趣的是单个参数N的简单函数。我认为它可以在O(N)
中计算(假设您不进入长算术区域) 。实际上,您可以在OEIS A143127处找到指定为
k = d,...,n的k * d(k)之和,其中d(k)是k的除数。
然而,可能不是那么明显,为什么这个序列是正确的答案。要了解原因,请查看区别F(N) - F(N-1)
。下一个N
会在范围(i, N)
中为i
添加[1, N]
对。对于p
的每个除数N
,将有N/p
对将p
加到总和中。换句话说,每个除数恰好将N
加到总和中。因此,如果d(N)
是除数的数量,那么对于所有对N * d(N)
,我们得到(i, N)
。
如果我们追求总和的顺序,我们可以得到更直接的公式。考虑一些固定的N
和m < N
。 m
将被添加多少次作为某对的公约数?好吧,它将被添加到所有对,其中两个数字除以m
。在floor(N/m)
之前,有m
个数字除以N
。由于我们只计算唯一对,因此每个floor(N/m) * (floor(N/m) + 1) / 2
对将m
添加到总和中。我们为所有m
添加了O(N)
- 时间公式
a(n) = sum_{m=1..N} m * floor(N/m) * (floor(N/m)+1)/2
OEIS提供了一个更复杂的公式,似乎有O(sqrt(N))
运行时间
a(n) = sum_{m=1..floor(sqrt(n))} m*(m+floor(n/m))*(floor(n/m)+1-m) - A000330(floor(sqrt(n)))
,其中
A000330(n) = n*(n+1)*(2*n+1)/6.
但我不确定他们是如何得到它的。仍然在我的测试中,这个公式为前30个值产生了正确的结果。