🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
1.1 输入描述
1.2 输出描述
1.3 测试样例
1.3.1 示例 1
1.3.2 示例 2
二、解题思路
三、代码实现
四、时间复杂度
一、题目描述
已知连续正整数数列 {K} = K1, K2, K3, ..., Ki 的各个数相加之和为 S, i=N (0<S<100000, 0<N<100000), 求此数列 K。
1.1 输入描述
输入包含两个参数:
1)连续正整数数列和 S;
2)数列列数的个数 N。
1.2 输出描述
如果有解,输出数列 K;如果无解,输出 -1。
1.3 测试样例
1.3.1 示例 1
输入
525 6
输出
85 86 87 88 89 90
1.3.2 示例 2
输入
3 5
输出
-1
二、解题思路
本题是一道数学题,用到下面两个公式。
公式一:S = (K1 + Kn) * N / 2
公式二:Kn = K1 + N - 1
两个公式结合后即可求出 K1 和 Kn。
三、代码实现
代码实现如下所示。
#include <iostream>
using namespace std;
int main()
{
int S, N;
while (cin>>S>>N) {
if ((2 * S) % N) {
cout<<-1<<endl;
continue;
}
int k1 = 2 * S / N - N + 1;
if (k1 % 2) {
cout<<-1<<endl;
continue;
}
k1 = k1 / 2;
int kn = k1 + N - 1;
for (int i = k1; i <= kn; ++i) {
if (i > k1) cout<<" ";
cout<<i;
}
cout<<endl;
}
return 0;
}
四、时间复杂度
时间复杂度:O(n)
其中,n 为数列的长度,在上述代码中,只需要通过简单几步的计算即可获得K1 和 Kn,只是最终输出的时候需要遍历 N,所以时间复杂度为O(n)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞