题目描述
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;
}