山东大学考研机试题——整数序列

题目描述

传送门------AcWing 3717. 整数序列 - AcWing

很多整数可以由一段连续的正整数序列(至少两个数)相加而成,比如 25=3+4+5+6+7=12+1325=3+4+5+6+7=12+13。

输入一个整数 N,输出 N 的全部正整数序列,如果没有则输出 NONE

输入格式

一个整数 N。

输出格式

  • 每行输出一个满足条件的整数序列。

  • 序列内部元素从小到大排序。

  • 优先输出首项更小的序列。

数据范围

2 ≤ N ≤ 107

输入样例:

复制代码
25

输出样例:

复制代码
3 4 5 6 7
12 13

思路及代码

二分查找

从 1 ~ n / 2 遍历 i,通过二分查找以 i 开头时的答案。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e7+7;
int n;
int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	
	cin>>n;
	LL k = n / 2;
	bool tag = false;
	for(LL i=1;i<=k;i++){
        // high = k + 1作为最大值是因为当最大值大于 n/2时,由于要求是一组连续的数,所以此时的序列至多有2个数
		LL low = i, high = k + 1;
		while(low < high){
			LL mid = low + high + 1 >> 1;
			if((mid - i + 1)*(i + mid) <= 2*n){
				low = mid;
			}else{
				high = mid -1;
			}
		}
		if((low - i + 1)*(i + low) == 2*n){
			tag = true;
			for(int j=i;j<=low;j++){
				cout<<j<<" ";
			}
			cout<<"\n";
		}
	}
	if(tag == false){
		cout<<"NONE";
	}
	return 0;
}

数学公式

该题本质考察的是一组连续数的和,则令这组连续数的开头是a,共k个数,那么这组数的和通过求和公式可得为 (a + a + k - 1) * k / 2。而我们需要求得是 a 和 k,当这两个未知数确定后,一组数便确定了。

因此考虑, (a + a + k - 1) * k / 2 = n,即 (2a + k - 1) * k = 2n,可知,由 a 和 k 组成的 y = (2a + k - 1) 和 x = k 两个公式是 2n 的因子。既然如此,我们可以去求 2n 的因子,考察满足条件的两个因子 x和y,由 x和y 可得到 a 和 k。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);

	int n;
	cin >> n;
	n *= 2;
	int cnt = 0;
    // 题目要求优先输出首项更小的序列,即 (2a + k - 1) * k 中的 a 更小。由 (2a + k - 1) * k = 2n 可知 k 越大 a越小,即因子 x 越大,a越小,所以这里 x 从大到小遍历 
	for (int x = sqrt(n); x > 1; x--) {
		if (n % x == 0) {
			int y = n / x;
			int t = y - (x - 1);
            // t = 2a,因此 t 必须是偶数
			if (t % 2 == 0) {
				cnt++;
				int a = t / 2;
				for (int i = a; i < a + x; i++) {
					cout << i << " ";
				}
				cout << "\n";
			}

		}
	}
	if (cnt == 0) {
		cout << "NONE";
	}
	return 0;
}
相关推荐
沐怡旸7 分钟前
【穿越Effective C++】条款13:以对象管理资源——RAII原则的基石
c++·面试
一个不知名程序员www20 分钟前
算法学习入门---二分查找(C++)
c++·算法
2301_807997381 小时前
代码随想录-day26
数据结构·c++·算法·leetcode
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【排序】双机位A-银行插队【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
TL滕1 小时前
从0开始学算法——第一天(认识算法)
数据结构·笔记·学习·算法
小欣加油1 小时前
leetcode 3318 计算子数组的x-sum I
c++·算法·leetcode·职场和发展
love is sour1 小时前
聚类(Clustering)详解:让机器自己发现数据结构
算法·支持向量机·聚类
烟袅1 小时前
LeetCode 142:环形链表 II —— 快慢指针定位环的起点(JavaScript)
前端·javascript·算法
CoovallyAIHub1 小时前
OCR战场再起风云:LightOnOCR-1B凭什么比DeepSeekOCR快1.7倍?(附演示开源地址)
深度学习·算法·计算机视觉
j_xxx404_2 小时前
C++ STL:list|了解list|相关接口|相关操作
开发语言·c++