英雄会第二届在线编程大赛·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水啊……..
唯一可惜的是,第一眼居然没看出来……
最后,我想说一句,决赛题目比资格赛的题目水!
相关文章推荐
- pongo(csdn英雄会题解)之三元组的数量--英雄会第二届在线编程大赛·CSDN现场决赛
- pongo(csdn英雄会题解)之三元组的数量--英雄会第二届在线编程大赛·CSDN现场决赛
- 三元组数量的c#求解-英雄会第二届在线编程大赛·CSDN现场决赛
- 【题解】英雄会第二届在线编程大赛·CSDN现场决赛:三元组的数量
- 英雄会第二届在线编程大赛·线上初赛:AB数
- 英雄会第二届在线编程大赛·线上初赛:AB 题解
- csdn第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 英雄会第四届编程大赛·CSDN现场决赛:比赛得分
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 【Java】 英雄会第四届在线编程大赛·线上初赛:带通配符的数 Java实现
- 微软必应·英雄会第三届在线编程大赛:几个bing?
- [转]微软联合CSDN英雄在线编程大赛
- 英雄会第四届在线编程大赛·线上初赛:带通配符的数
- CSDN英雄会第四届在线编程大赛·线上初赛:带通配符的数
- 微软必应·英雄会第三届在线编程大赛:几个bing
- 英雄会第二届在线编程大赛圆满落幕 雅虎刷题狂人夺冠
- 几个bing的c#求解--微软必应·英雄会第三届在线编程大赛