题目
题目来源: AcWing 3717. 整数序列
题目说明:
很多整数可以由一段连续的正整数序列(至少两个数)相加而成,比如 25=3+4+5+6+7=12+13。
输入一个整数 N,输出 N的全部正整数序列,如果没有则输出 NONE。
输入格式:
一个整数 N。
输出格式:
每行输出一个满足条件的整数序列。序列内部元素从小到大排序。优先输出首项更小的序列。
数据范围:
2≤N≤10的7次方
输入样例:
25
输出样例:
3 4 5 6 7
12 13
解题代码及思路
代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> prime; // 存质因数
int n;
int f = 0;
int main() {
cin >> n;
for (int i = 2; i <= n * 2 / i; i ++ ) {
if (n * 2 % i == 0) // 如果2n能整除i
prime.push_back(i); // 说明i是2n的较小的内个质因数,存起来
}
// 判断加拆出整数数列
for (int i = prime.size() - 1; i >= 0; i -- ) { // 从后取出质因数
int k = prime[i]; // k就是最后整数序列的元素个数
if ((2 * n - k * (k - 1)) / 2 % k != 0) // 如果用递推式算x(数列的首项)得不到整数
continue; // 说明这个k不符合要求,跳过这次循环
f = 1; // 进行到现在还没有退出循环,说明有符合要求的递推式了
int x = (2 * n - k * (k - 1)) / (2 * k); // 求出当前式子的x
for (int i = 0; i < k; i ++ )
cout << x ++ << ' '; // 依次输出这个整数序列
cout << endl;
}
if (f == 0)
cout << "NONE";
return 0;
}