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<stdio.h>
#include<math.h>
//高斯公式 和=(首项+末项)*项数/2
void main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&!(n==0&&m==0))
{
for(int i=(int)(sqrt(2*m));i>=1;i--)
{
int a=m/i-(i-1)/2;
int b=i+a-1;
if((a+b)*i==2*m)
printf("[%d,%d]\n",a,b);
}
printf("\n");
}
}
第一遍直接用递推加高斯公式,没有任何技巧,额。时间就超了。时间复杂度大概有n²
第二遍,用了数学方法,求出项数的限制条件,根据项数来进行递推。就只有一重循环了。