题目
给出一个数,看他是否是几个连续的数的平方和,先输出方案种数,再每一种输出连续数的个数,在输出这几个连续的数。
Sample Input
2030
Sample Output
2
4 21 22 23 24
3 25 26 27
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#define m(a,b) memset(a,b,sizeof a)
#define en '\n'
using namespace std;
typedef long long ll;
const int N=1e7+2,M=1e5+2,K=17;
struct node{ll l,r;}fin[N];
bool cmp(node x,node y)
{
return x.r-x.l+1>y.r-y.l+1;
}
int main()
{
ll n;scanf("%lld",&n);
int l=1,r=1,k=sqrt(n),num=0;ll sum=0;
while(1)
{
while(sum<n&&r<=k)
sum+=(ll)r*r,r++;//(注意r*r可能会溢出!!!)
if(sum<n)
break;
if(sum==n) fin[++num]=(node){l,r-1};
sum-=(ll)l*l,l++;//(注意l*l可能会溢出!!!)
}
sort(fin+1,fin+num+1,cmp);
printf("%d",num);
for(int i=1;i<=num;i++)
{
printf("\n%d",fin[i].r-fin[i].l+1);
while(fin[i].l<=fin[i].r)
printf(" %d",fin[i].l++);
}
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#define m(a,b) memset(a,b,sizeof a)
#define en '\n'
using namespace std;
typedef long long ll;
const int N=1e7+2,M=1e5+2,K=17;
struct node{ll l,r;}fin[N];
bool cmp(node x,node y)
{
return x.r-x.l+1>y.r-y.l+1;
}
int main()
{
ll n;
scanf("%lld",&n);
int l=1,r=1,k=sqrt(n),num=0;ll sum=r*r;//r既然已经等于1,就说明sum已经取[l,r]即[1,1]了.
while(r<=k)
{
if(sum==n) fin[++num]=(node){l,r};//这个r是真实的r,不是r+1
if(sum<n)
r++,sum+=(ll)r*r;
else
sum-=(ll)l*l,l++;
if(l==r+1)
{
r++;
sum+=(ll)r*r;// !!!
}
}
sort(fin+1,fin+num+1,cmp);
printf("%d",num);
for(int i=1;i<=num;i++)
{
printf("\n%d",fin[i].r-fin[i].l+1);
while(fin[i].l<=fin[i].r)
printf(" %d",fin[i].l++);
}
}