对一个给定的正整数 MM,求出所有的连续的正整数段(每一段至少有两个数),这些连续的自然数段中的全部数之和为 MM。
例子:1998+1999+2000+2001+2002=100001998+1999+2000+2001+2002=10000,所以从 19981998 到 20022002 的一个自然数段为 M=10000M=10000 的一个解。
Input
包含一个整数的单独一行给出 MM 的值(10≤M≤2,000,00010≤M≤2,000,000)。
Output
每行两个正整数,给出一个满足条件的连续正整数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。
Sample 1
Inputcopy | Outputcopy |
---|---|
10000 | 18 142 297 328 388 412 1998 2002 |
思路:
1.双指针:左右两端均向右移动更新,寻找符合条件的区间;
2.当sum大于目标值m时,就需要减去左端点来缩小范围,此时左端点也需要不断地自增,向右移动
#include<bits/stdc++.h>
using namespace std;
const int N=2e8+5;
long long sum;
int main()
{
int m;
cin>>m;
for(int i=1,j=1;i<=m;i++)
{
sum+=i; //依次累加
while(sum>m){
sum=sum-j;//减去左端点的值
j++; //向右移动一位
}
if(sum==m)
{
if(i-j>=1) //确保每一段至少有两个数
cout<<j<<" "<<i<<endl;
}
}
return 0;
}