天天看点

HDU 2058 The Sum Problem

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]

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=45000;
int n,f[50005],m,x,y;

int main()
{
    for (int i=1;i<=maxn;i++) f[i]=i*(i+1)>>1;
    while (~scanf("%d%d",&n,&m),n+m)
    {
        int u=lower_bound(f+1,f+maxn,m)-f;
        for (int i=u;i;i--)
        if (2*m%i==0)
        {
            x=i-1;
            y=2*m/i;
            if (((x+y)>>1)>n) break;
            if ((x+y)%2==0)
            {
                printf("[%d,%d]\n",(y-x)>>1,(y+x)>>1);
            }
        }
        printf("\n");
    }
}