原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2058

思路:等差数列公式变形:sum = a1 * len + len *(len -1)/2

抽象成一句话就是本题的思路:根据数列的长度和数列的和就可以算出首项,因为知道长度,所以区间就出来了(看了好多博客,都没说清楚,晕我一大天……)

然后由式子的变形(2*a1 + len -1)*len  = 2 *sum可得len绝对小于Sqrt(2*sum),因为a1>=1故len-1+2*a1>len(模糊比较即可)

下面判断就用一个双重确定就可以了,因为double转long会丢失精度,所以如果转换之后依然相等,就说明找到了,输出即可

source code:

package hduoj;

import java.util.Scanner;

public class hdoj_2058 {
/**
* 注释掉的是穷举法,超时了
* 需要使用的是等差数列的公式sum = 2 * len +len(len-1)/2
*/
// public static void main(String[] args) {
// Scanner sc = new Scanner(System.in);
// while(true){
// long N = sc.nextLong();
// long M = sc.nextLong();
// if(N==0||M==0) break;
// HashMap<Long,Long> map = new HashMap<>();
// long start = 0;
//// long end = 0;
// for(long i = 1;i<M/2;++i){
// long sum = i;
// start = i;
// long j ;
// for(j = i+1;j<Math.sqrt(M);++j){
// sum += j;
// if(sum==M){
// map.put(start,j);
// }
// if(sum>M) break;
// }
// }
// if(map.size()==0) System.out.println("["+M+","+M+"]");
// else {
// map.put(M,M);
// for(Map.Entry<Long,Long> each : map.entrySet()){
// System.out.println("["+each.getKey()+","+each.getValue()+"]");
// }
// }
// }
// }
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
long N = sc.nextLong();
long M = sc.nextLong();
if(N==0||M==0) break;
long len = (long)Math.sqrt(2*M) + 1;//此处加一是因为下面的循环判断条件会减一个一,如果不加就会少一个长度
while(len--!=1){
long start = (2*M/len + 1 - len)/2;
if((2*start + len -1)*len/2 == M){
System.out.println("["+start+","+(start + len -1)+"]");
}
}
System.out.println();
}
}
}

代码已经ac

希望对大家有所帮助

以上

杭电oj_2058——The sum problem(java实现)的更多相关文章

  1. 杭电oj 4004---The Frog Games java解法

    import java.util.Arrays; import java.util.Scanner; //杭电oj 4004 //解题思路:利用二分法查找,即先选取跳跃距离的区间,从最大到最小, // ...

  2. 杭电oj An easy problem

    </pre><h1 style="color: rgb(26, 92, 200);">An easy problem</h1><stron ...

  3. 杭电 1016 Prime Ring Problem

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. 杭电 1003 Max Sum (动态规划)

    参考:https://www.cnblogs.com/yexiaozi/p/5749338.html #include <iostream> #include <cstdio> ...

  5. 杭电 5053 the Sum of Cube(求区间内的立方和)打表法

    Description A range is given, the begin and the end are both integers. You should sum the cube of al ...

  6. 杭电1003 Max Sum 【连续子序列求最大和】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目意思: 即给出一串数据,求连续的子序列的最大和 解题思路: 因为我们很容易想到用一个max ...

  7. 杭电1003 Max Sum TLE

    这一题目是要求连续子序列的最大和,所以在看到题目的一瞬间就想到的是把所有情况列举出来,再两个两个的比较,取最大的(即为更新最大值的意思),这样的思路很简单,但是会超时,时间复杂度为O(n^3),因为有 ...

  8. 杭电oj_1713——相遇周期(java实现)

    question:相遇周期 思路: 首先将两个分数化为最简形式(也就是分子分母同时除以最大公约数) 然后题意是要求两个分数的最小公倍数 借助以下两个公式,就可以求出结果 1.最小公倍数*最大公约数 = ...

  9. 杭电 1002 A + B Problem II【大数相加】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 解题思路:就是把大的数用数组存放起来,像小学的时候用竖式加法来算两个数相加那样算: 反思:思路很 ...

随机推荐

  1. javascript30--day03--Css Variables

     相关视频链接:https://www.bilibili.com/video/av8481988/?p=5 相关github地址:https://github.com/soyaine/JavaScri ...

  2. codewars--js--counting duplicates

    题目描述: Count the number of Duplicates Write a function that will return the count of distinct case-in ...

  3. centos7安装Elasticsearch及Es-head插件详细教程(图文)

    懒惰了很久,今天来写一下Elasticsearch在centos7上安装教程以及安装过程中可能出现的报错解决方式,有不对的地方,烦请各位看官多多指教! 一.ES安装 1.环境检查 确保有java环境, ...

  4. 【学习笔记】:JavaScript中的BOM对象

    JavaScript中的BOM对象 BOM(Browser Object Model):浏览器对象模型. BOM可用于对浏览器窗口进行访问,但BOM没有相关的标准,所以根据浏览器的不同,其中定义的对象 ...

  5. Java @Deprecated Annotation(注解)

    在本部分的快速指南中,我们将会查看 Java 的 deprecated API 和如何在程序中使用 @Deprecated 注解. @Deprecated Annotation(注解) 作为程序的进化 ...

  6. win10安装两个不同版本的mysql(mysql5.7和mysql-8.0.19)

    win10中安装mysql5.7后,安装mysql-8.0.19 在D:\mysql-8.0.19-winx64目录下创建一个my.ini文件 [mysqld] # 设置3307端口 port # 设 ...

  7. python学习----文件的操作(2)

    1.文件指针的操作 f=open("yesterday","r",encoding="utf-8") #文件句柄 #文件内指针的操作 pri ...

  8. Apache Avro总结

    参考 Apache Avro™ 1.9.0 Specification Avro介绍 小而巧的数字压缩算法:zigzag   原始类型(Primitive Types) 类型名 描述 描述 二进制编码 ...

  9. opencv —— erode、dilate 腐蚀与膨胀

    腐蚀与膨胀是形态学滤波.其中,腐蚀是最小值滤波,膨胀是最大值滤波,即分别选取内核中的最小值与最大值赋值给锚点.若内核为 N×1 或 1×N 形状,可用于横纵方向直线检测. 膨胀:dilate 函数 v ...

  10. vscode侧边栏字体大小修改

    1.找到安装路径下,workbench.desktop.main.css 文件 C:\z_my_install\Microsoft VS Code\resources\app\out\vs\workb ...