题意:
给一个数 n (1e14)。
求一段连续的数的数字,使得其平方和等于n。
输出的时候,先输出有多少组,然后每组的开头输出有多少个元素,然后输出这些元素。
解析:
尺取法。
需要注意的地方是s和t要从1开始,否则wa。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
using namespace std;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = 4 * atan(1.0);
const double ee = exp(1.0);
const int maxn = 10000 + 10;
vector<pair<LL, LL> > ans; // fr <-> to
void solve(LL n)
{
ans.clear();
LL s = 1, t = 1;
LL sum = 0;
while (s * s <= n)
{
while (t * t <= n && sum < n)
{
sum += t * t;
t++;
}
// if (sum < n)
// break;
if (sum == n)
{
ans.push_back(make_pair(s, t));
}
sum -= s * s;
s++;
}
int sz = ans.size();
printf("%d\n", sz);
for (int i = 0; i < sz; i++)
{
printf("%d", ans[i].second - ans[i].first);
for (int j = ans[i].first; j < ans[i].second; j++)
{
printf(" %d", j);
}
puts("");
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
LL n;
while (~scanf("%lld", &n))
{
solve(n);
}
return 0;
}