尺取:维护一段连续的区间具有某个性质。
这里维护连续区间元素平方和小于等于n。
vector<int> v[N];
int main()
{
ll n;
while (cin >> n)
{
ll l = 1, r = 0;
ll sum = 0;
int cs = 0;
while(1)
{
r++;
if (r*r > n)break;
sum += r * r;
while (sum > n&&l <= r)
{
sum -= l * l;
l++;
}
//循环后是小于或等于
if (sum == n)
{
++cs;
f(j, l, r)v[cs].push_back(j);
}
}
cout << cs << endl;
f(j, 1, cs)
{
printf("%d ", (int)v[j].size());
int tt = v[j].size();
f(i, 0, tt - 1)
{
if (i == tt - 1)printf("%d\n", v[j][i]);
else printf("%d ", v[j][i]);
}
}
}
return 0;
}