zzuli 20级第七次周赛 2744 问题J: 学长的数组

题目描述

hyk学长有一个长度为n的数组a[],a[i] = i (1 <= i <= n),llx想寻找若干个区间[l,r]使得a[i] + … + a[r] = n (l < r)。但是hyk太懒了,所以让你来帮助他来解决这个问题。

输入

包含一个整数的单独一行给出n的值(10 <= n <= 200000000)。

输出

每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。

样例输入

10000

样例输出

18 142
297 328
388 412
1998 2002

提示

1998+1999+2000+2001+2002 = 10000
所以1998到2002为10000的一个解

这样写竟然没超时…应该还能优化的,不过既然过了,就懒得改了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int main(){
	LL n;
	cin >> n;
	LL l = 1, r = 2;
	while(l <= n/2){
	    //求l到r的和
		LL sum = (l+r) * (r-l+1) / 2;
		if(sum < n){
			r++;
		}else if(sum > n){
			l++;
			r--;
		}else{
			cout << l << " " << r <<endl;
			l = l++;
		}
	}
	return 0;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值