给定一个数要求所有能够构成连续整数平方和的方法。
以1-sqrt(n)为区间用尺取法解决。
区间[s,t),s和t要用long long,用int就会TLE,不知道是为什么….
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
vector<pair<int, int> > v;
int main(int argc, char const *argv[]) {
long long n;
while (scanf("%lld", &n) == 1) {
v.clear();
int range = sqrt(n);
long long s = 1, t = 1, sum = 0;
for ( ; ; ) {
while (sum < n) {
sum += t * t;
t++;
}
if (t > range + 1) {
break;
}
if (sum == n) {
v.push_back(make_pair(s, t));
}
sum -= s * s;
s++;
}
printf("%lu\n", v.size());
for (int i = 0; i < v.size(); i++) {
printf("%d", v[i].second - v[i].first);
for (int j = v[i].first; j < v[i].second; j++) {
printf(" %d", j);
}
putchar('\n');
}
}
return 0;
}