1. 程式人生 > >Graveyard Design POJ - 2100 (尺取法)

Graveyard Design POJ - 2100 (尺取法)

傳送門

題意:將一個整數分解為連續數平方之和,有多少種分法?

題解 :直接使用尺取法並記錄答案即可

附上程式碼:


#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

typedef long long ll;

vector<pair<int,int> >v;

ll n;

int main()
{
    scanf("%lld",&n);
    ll lb=1,ub=1,sum=0;
    while(lb*lb<=n){
        if(sum==n){
            v.push_back(make_pair(ub-lb,lb));
        }
        if(sum<=n){
            sum+=ub*ub;
            ub++;
        }else{
            sum-=lb*lb;
            lb++;
        }
    }
    int cnt=v.size();
    sort(v.begin(),v.end());
    printf("%d\n",cnt);
    for(int i=cnt-1;i>=0;i--){
        printf("%d",v[i].first);
        for(int j=v[i].second;j<v[i].second+v[i].first;j++){
            printf(" %d",j);
        }
        printf("\n");
    }
    return 0;
}