https://www.luogu.org/problemnew/show/P1147
题意:输入一个n,求连续几个数加起来等于n,输出这几个连续的数的第一个和最后一个。10<=n<=2000 000
由于n巨大,双重暴力显然超时,网上有很多通过长度用公式的写法,没想到一个等差能被翻出很多花样,深表佩服。
不过那些看起来很nb的公式我是推不出来,还是用尺取法靠谱点,时间复杂度也是O(n)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<map> #include<string> #define ll long long #define inf 0x3f3f3f3f using namespace std; int n; int main() { while(scanf("%d",&n)!=EOF) { int m=n/2; int l=1,r=2; int sum=3; while(l<=m) { if(sum==n) { printf("%d %d\n",l,r);///如果相同,sum先减左指针再移动 或者 右指针先移动再加到sum里 r++; sum+=r; /* sum-=l; l++;*/ } else if(sum<n) { r++; sum+=r;///右指针先移动再加到sum里 } else { sum-=l; l++;///sum先减左指针再移动 } } } return 0; }