双倍超立方数是指一个正整数可以正好被拆分为两种不同的a^3+b^3的方式,其中a,b均为整数且0 <a <=b。对于任何一个指定的 int n, 返回所有的小于等于n的双倍超立方数的个数。
试试 (a^3 + b^3) / (a+b),可得 a^2 + b^2 - ab,好了,那么就可以得下式
a^3 + b^3 = (a + b)^3 - 3 ab (a + b)
又有 ab <= (a+b)^2 / 4
可得
a^3 + b^3 = (a + b)^3 - 3 ab (a + b) >= (a+b)^3 / 4
也就是
a^3 + b^3 >= (a+b)^3 / 4
设 m = a + b,则
n = a^3 + b^3 >= m^3 / 4
也就是
n >= m^3 / 4
好了,那么取 m
m <= (4n)^(1/3) .....................(1)
注意等号成立的条件是 m 为偶数时有 a = b
还有一个式子需要满足:
a, b < n ^ (1/3) .....................(2)
(1)(2)式合起来得
a + b = m <= (4n)^(1/3) .........等号成立条件为 a = b = m/2
0 < a, b < n ^ (1/3)
可以由图像判断取值范围。
好了,最后讨论一下 m 的取值。
m 是一系列 a+b 的和的数列的上确界,因此 {2... m}的情况都要考虑。
得如下计算代码:
那么,m 和 p 先加一,后判断减一是怎么回事儿呢?
你不信你自己试试:
(int)pow( 1000, 1.0 / 3 ) = 9 !所以只好如此了。
看吧,一次线性的上限为 o(n^0.33) 的复杂度,就解决了。