1312 连续自然数和
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 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
/* 这么水的题都超时,基础不牢啊23333 还是得下功夫抓基础 别老想着拔高!!!! 去年NOIP犯的错误还没想着吗?! 借此题给自己严重的警告! */ #include<cstdio>int main() {int n,s,t;scanf("%d",&n);for(int i=1; i<n; i++){s=n;t=i;while(s>0&&t<=n){s=s-t;t++;}if(s==0) printf("%d %d\n",i,t-1);} }
//前缀和 #include<cstdio> #define lint long long using namespace std;lint s[1000009];int main() {int n,i,j;scanf("%d",&n);int m=(n+1)>>1;s[0]=0;for (i=1;i<=m;i++)s[i]=s[i-1]+i;i=0;j=1;while(i<=m&&j<=m){if (s[j]-s[i]==n){printf("%d %d\n",i+1,j);i++;j++;}else if (s[j]-s[i]>n)i++;else j++;}return 0; }
还有一个数论做法,表示很弱看不懂.......0.0