HDOJ2058_The sum problem

来源:互联网 发布:matlab求解矩阵方程组 编辑:程序博客网 时间:2024/05/21 08:44

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 1050 300 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;}}} * */


原创粉丝点击