Problem Description
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.
Input
Input contains multiple test cases. each case contains two integers N, M( 1 <= N, M <= 1000000000).input ends with N = M = 0.
Output
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.
Sample Input
20 10 50 30 0 0
Sample Output
[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;
}
}
}
* */