## The sum problem(hdu 2058)解题报告

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]

[10,10] （单个数也算一个子序列）

[6,9]

[9,11]

[30,30]

sum(a,b)=sum(1,b) –sum(1,a-1) 将sum(b,a)定义为闭区间的和。令c=a-1

b-c=x

c=(y-x-1)/2 ,a=(y-x+1)/2 （2）

(1) : b=(20+1-1)/2=10 ,a=(20-1+1)/2=10

(2) : b=(10+2-1)/2=5.5 a=(10-2+1)/2=4.5 无效

(3) ：b=(5+4-1)/2=4 a=(5-4+1)/2=1

#include <string.h>
#include <stdio.h>
#include <math.h>

int
main()
{

int
i,j,n,m,t;
while
(scanf("%d%d",&n,&m), m && n)
{

m*=2;
for
(i=(int)sqrt((double)m);i>=2;i--)
{

if
(m%i==0)
{

t=m/i+1-i;
if
(t>=2 && t%2==0)
{

t>>=1;
if
(t+i-1<=n)
printf("[%d,%d]\n",t,t+i-1);
}
}
}

m>>=1;
if
(n>=m) printf("[%d,%d]\n",m,m);
printf("\n");
}

return
0;
}

posted on 2010-07-21 23:29  网络小筑  阅读(1321)  评论(0编辑  收藏  举报