连续自然数和(codevs 1312)
题目描述 Description
对于一个自然数M,求出所有的连续的自然数段,使得这些连续自然数段的全部数字和为M.
eg:1998+1999+2000+2001+2002=10000,所以从1998到2002的一个自然数段为M=10000的一个解。
输入描述 Input Description
一个数M
输出描述 Output Description
每行两个数,为连续自然数段的一头一尾,所有输出行的第一个数按照升序排列
样例输入 Sample Input
10000
样例输出 Sample Output
18 142
297 328
388 412
1998 2002
//优化真的很难想啊 #include<cstdio> #include<iostream> #define M 1000010 using namespace std; int a[M]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) a[i]=i+a[i-1]; int tmp=2; for(int i=1;i<=n/2+1;i++) for(int j=i+1;j<=n/2+1;j++) if(a[j]-a[i-1]==n) { printf("%d %d\n",i,j); tmp=j; break; } else if(a[j]-a[i-1]>n)break; return 0; }