题目链接:
http://poj.org/problem?id=2100
题解:
尺取
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
#define met(a,b) memset(a,b,sizeof(a))
vector<pair<ll,ll> >v;
void slove(ll num)
{
ll l=1,r=1,sum=0;//初始化左右端点
ll ans=0;
v.clear();
while(1)
{
while(sum<num)//判断右端点
{
ans=r*r;
sum+=ans;
r++;
}
if(ans>num)
break;
if(sum==num)
v.push_back(make_pair(l,r));
sum-=l*l;//调节左端点
l++;
}
ll m=v.size();
printf("%lld\n",m);
for(ll i=0;i<m;i++)
{
ll x=v[i].first;
ll y=v[i].second;
printf("%lld",y-x);
for(ll j=x;j<y;j++)
printf(" %lld",j);
printf("\n");
}
}
int main()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
if(n==0)
break;
slove(n);
}
}