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;
}