【HDU

来源:互联网 发布:pcb电路图设计软件 编辑:程序博客网 时间:2024/05/16 15:10

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<bits/stdc++.h>using namespace std ;typedef long long LL ;const int MAXN = 700+10 ;const int MAXM = 1e5 ;const int mod  = 1007 ;const int inf  = 0x3f3f3f3f;int main(){    LL n,m;       while(~scanf("%lld%lld",&n,&m)&&(n||m)){            for(LL i=sqrt((double)2*m);i>0;i--){// 因为最差的情况就是从1到x的和为m 【(1+x)*x/2=m】,所以上界小于sqrt(2*m)足以                if((m<<1)%i) continue;                if(((m<<1)/i+i-1)%2) continue;                LL b=((m<<1)/i+i-1)/2;                LL a=(m<<1)/i-b;                if(a<0||b<0)  continue;                if(a>b) swap(a,b);                printf("[%lld,%lld]\n",a,b);            }            puts("");      }     return  0;}
原创粉丝点击