英雄会第二届在线编程大赛·CSDN现场决赛:三元组的数量【水题】

英雄会第二届在线编程大赛·CSDN现场决赛:三元组的数量

·        2013-12-292014-01-28

题目详情

{5 3 1}和{7 5 3}是2组不同的等差三元组,除了等差的性质之外,还有个奇妙的地方在于:5^2 – 3^2 – 1^2 =7^2 – 5^2 – 3^2 = N = 15。{19 15 11}同{7 5 3}这对三元组也存在同样的性质:19^2 – 15^2 – 11^2 = 7^2 –5^2 – 3^2 = N = 15。这种成对的三元组还有很多。当N = 15时,有3对,分别是{5 31}和{7 5 3},{5 3 1}和{19 15 11},{7 5 3}和{1915 11}。 现给出一个区间 [a,b]求a <= N <= b 范围内,共有多少对这样的三元组。(1 <= a <= b <= 5*10^6)

例如:a = 1,b = 30,输出:4。(注:共有4对,{5 3 1}和{7 5 3},{5 3 1}和{19 15 11},{75 3}和{19 15 11},{34 27 20}和{12 9 6})

答题说明

main函数可不用完成,完成功能函数即可。

 

分析:

ps:题目有没有说清楚的条件,但是根据样例可以推出来,就是,

1.数列必须递减

2.数列首相必须大于零

3.所求的是三元组对,同一个N如果存在n个三元组,则算C(n,2)个

说是水题,其实就是水题。

首先,假设数列的三个数是x-d, x , x+d    (x>0,d>0)

则N = (x+d)^2-x^d-(x-d)^2 = 4*x*d-x^2 = x*(4d-x)

由表达式N= x*(4d-x) 可知,x一定是N的一个约数(N>0 所以4*d-x>0).【结论1,重要结论】

那么,接下来,枚举x(从1到b)。对于每个固定的x,根据N的范围,

a =< 4*x*d-x^2  <= b

因此d的取值区间长度=(b-a)/4x,【结论2,重要结论】

当然d还要满足0<d<a

结论2说明了在枚举x的时候,x越大,d的范围越小,而且是倒数关系,典型的nlog(n)的算法。

数学公式:1+1/2+1/3+……+1/n=ln(n)+C,C为欧拉常数

 

复杂度分析: n * logn

假设x1->b,考虑d的取值范围

((b-a)/4) * (1/1+1/2+1/3+…+1/b) = ((b-a)/4)*log(b)

 

n*logn水啊……..

唯一可惜的是,第一眼居然没看出来……

最后,我想说一句,决赛题目比资格赛的题目水!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值