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 ",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 ",i+1,j); i++;j++; } else if (s[j]-s[i]>n) i++; else j++; } return 0; }
还有一个数论做法,表示很弱看不懂.......0.0