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.
20 10
50 30
0 0
[10,10]
[4,8]
[6,9]
[9,11]
[30,30]分析:这是杭电2058题,一开始我用两重遍历,反复tle超时。没办法,去网上找了优化方法。i代表首项,j代表项数。b = (a首 + a末) *项数/2 = (i + i + j - 1)*j/2所以(i + i + j - 1) * j = 2 * b. 所以 j < sqrt(b*2)
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<string.h>
using namespace std;
int main()
{
double a, b;
while (cin >> a >> b, a+b)
{
int j, i;
for (j =(int)sqrt(b*2); j > 0; j--)
{
i =(int)((2*b)/j + 1 -j)/2;
if ((i + i + j - 1)*j/2 == b)
cout << "[" << i << "," << i+j-1 << "]" << endl;
}
printf("\n");
}
return 0;
}