2058 The sum problem

关键字: 代码分享 杭电100题

问题描述

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]

问题分析

Problem Analyse

给出一个数列1,2,3,......N,你所要做的就是算出和为M的所有连续的数列。

简单数学题。

Algorithm Analyse

我们都知道,在连续的整数序列里,1, 2, 3, ..., n-1, n, n+1, ...

∵ 2n = [(n-1) + (n+1)] = [(n-2) + (n+2)] = ... = [1 + (2n-1)]
∴ (n-m) + (n-m+1) + ... + n-1 + n + n+1 + ... + (n+m-1) + (n+m) = (2m+1) × n
∵ 2m+1是奇数
∴ 如果X能被2m+1整除(即能被分割成2m+1份),且n = X / (2m+1)
  则X = (n-m) + (n-m+1) + ... + n-1 + n + n+1 + ... + (n+m-1) + (n+m)

同理,在整数序列中,又有这样的规律:

∵ n + (n+1) = (n-1) + (n+2) = ... = 1 + 2n
∴ (n-m) + (n-m+1) + ... + (n+m+1) = (m+1)(2n+1)
∴ 如果X能被(2n+1)整除,且X / (2m+2) = n
  则X = (n-m) + (n-m+1) + ... + (n+m+1)

运算的时候,保证n-m大于0,n+m+1或n+m小于给定的上界即可。

参考源码

redraiment使用Emacs Lisp批量迁移《HDU 2050-2059》