双倍超立方数

双倍超立方数是指一个正整数可以正好被拆分为两种不同的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) 的复杂度,就解决了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值