POJ-2100 Graveyard Design(尺取法)

题意

给定一个数 n ,求又多少种分案将 n 分为若干个连续整数的平方和,并输出所有方案。
1 n 10000

思路

与上题基本类似,直接尺取即可。

代码

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
typedef long long LL;
using namespace std;
LL _L[1000003],_R[1000003];

int main()
{
    LL n;
    while(~scanf("%lld",&n))
    {
        int ways=0,R=0,sqn=sqrt(n);
        LL sum=0;
        FOR(L,1,sqn)
        {
            while(R<=sqn&&sum<n)R++,sum+=1LL*R*R;
            if(R>sqn)break;
            if(sum==n){_L[++ways]=L,_R[ways]=R;}
            sum-=1LL*L*L;
        }
        printf("%d\n",ways);
        FOR(i,1,ways)
        {
            printf("%d ",_R[i]-_L[i]+1);
            FOR(j,_L[i],_R[i])printf("%d ",j);
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/paulliant/article/details/80869019