您的位置:首页 > 编程语言

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

2014-01-03 00:37 459 查看



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

· 2013-12-29至2014-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
假设x从1->b,考虑d的取值范围
((b-a)/4) * (1/1+1/2+1/3+…+1/b) = ((b-a)/4)*log(b)

n*logn水啊……..
唯一可惜的是,第一眼居然没看出来……
最后,我想说一句,决赛题目比资格赛的题目水!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐