版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happy_Du/article/details/74937448
题目链接: 这里写链接内容
题目大意: 给出一个n,求连续递增数列的平方的和为n的所有情况。
input:n = 25
output:
2
2 3 4(2表示两个数)
1 5(1表示一个数)
题目分析:尺取法(也叫滑动窗口吧)模板。计算[s,t]之间的所有数字平方和sum,如果大于n,就s++,如果小于n,t++,每次更新sum,就好了。
Problem: 2100 User: ChenyangDu
Memory: 160K Time: 3657MS
Language: C++ Result: Accepted
Source Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
long long n;
struct node{
long long l,s,t;
}ans[10000];
int ans_r = 0;
int main(){
scanf("%lld",&n);
long long s = 1,t = 1,sum = 1;
while(t*t <= n){
if(sum < n){
t++;
sum += t*t;
}else if(sum > n){
sum -= s*s;
s++;
}else{
node &r = ans[ans_r++];
r.l = t-s+1;
r.s = s;
r.t = t;
sum -= s*s;
s++;
}
}
printf("%d\n",ans_r);
for(long long i=0;i<ans_r;i++){
node &r = ans[i];
printf("%lld ",r.l);
for(long long j = r.s;j<r.t;j++)
printf("%lld ",j);
printf("%lld\n",r.t);
}
return 0;
}