您的位置:首页 > 其它

HDOJ2058_The sum problem

2017-10-14 15:50 417 查看
[align=left]Problem Description[/align]
Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the sum of the sub-sequence is M.
 
[align=left]Input[/align]
Input contains multiple test cases. each case contains two integers N, M( 1 <= N, M <= 1000000000).input ends with N = M = 0.

 
[align=left]Output[/align]
For each test case, print all the possible sub-sequence that its sum is M.The format is show in the sample below.print a blank line after each test case.

 
[align=left]Sample Input[/align]

20 10
50 30
0 0

[align=left]Sample Output[/align]

[1,4]
[10,10]

[4,8]
[6,9]
[9,11]
[30,30]

题目大意:从1到n的范围内,公差为1的数列的和是m 的数列,输出[a1,an],每组之间空一行

本题需要用到等差数列的公式

   

   

import java.util.Scanner;

public class P2058 {
private static Scanner scanner;
public static void main(String[] args) {
scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
int m = scanner.nextInt();
if(n==0 && m==0){
break;
}
// 从a 开始, 一直加到sqrt(2*m) > m
//也就是   a是a1,i是an
//sqrt()函数要求传入的是double类型数字
 for (int i = (int) Math.sqrt(2 * m); i >= 1; i--) {
int a = (m - (i * (i - 1)) / 2) / i;
if (m == a * i + (i * (i - 1)) / 2) {
System.out.println("[" + a + "," + (a + i - 1) + "]");
}
}
System.out.println();
}
}
}
/*
* 超时:
* while(scanner.hasNext()){
int n = scanner.nextInt();
int m = scanner.nextInt();
if(n==0 && m==0){
break;
}

int sum = 0;
for (int i = 1; i <= n; i++) {
sum = i;
if(sum == m){
System.out.println("["+i+","+i+"]");
break;
}
for (int j = i+1; j <= n; j++) {
sum += j;
if(sum == m){
System.out.println("["+i+","+j+"]");
break;
}
if(sum>m){
break;
}
}
}
* */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: