1 条题解
-
5
#include<cstdio> using namespace std; /* x:子数列首项 y+1:子数列长度 (x+(x+y))*(y+1)/2 = n //高斯求和公式 化简原关于 x 的一元一次方程,得: (x+(x+y))*(y+1)/2 = n (x*2+y)*(y+1)/2 = n (x*2+y)*(y+1) = n*2 (y*2+2)*x+y*y+y = n*2 x = (n*2-y*y-y)/(y*2+2) 程序思路: 循环遍历 y∈[1, n), 当且仅当 x∈N* 时 符合题意 */ int main(){ int n; scanf("%d", &n); //本题目要求:按照 子数列首项从小到大(即 子数列长度从大到小) 进行排序,故需对于符合题意的 (x, y) 进行存储,再反向循环遍历输出 int lst[100][2], l=-1; //本题目规定:连续子数列的长度 ≥1,即 y∈[1, n) for(int y=1; y<n; y++){ //循环遍历 子数列长度(y+1) double x=double(n*2-y*y-y)/(y*2+2); //计算 子数列首项(x) if(x <= 0) break; if(int(x) == x){ //x∈N*,符合题意 lst[++l][0] = x; lst[l][1] = y; } } do{ for(int i=0; i<=lst[l][1]; i++) printf("%d ", lst[l][0]+i); printf("\n"); } while(l--); //反向循环遍历输出 return 0; }
- 1
信息
- ID
- 2149
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 29
- 已通过
- 5
- 上传者