洛谷1147 连续自然数和

来源:互联网 发布:星际战甲克洛诺斯数据 编辑:程序博客网 时间:2024/05/22 06:05

连续自然数和

本题地址: http://www.luogu.org/problem/show?pid=1147

题目描述

对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M。
例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。
输入输出格式
输入格式:
包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)。

输出格式:

每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。

输入输出样例

输入样例#1:

10000


输出样例#1:

18 142
297 328
388 412
1998 2002

分析

可以使用前缀和数组将从1~i的和存在sum[i]中
然后从 j到i的和即为 sum[i]-sum[j-1];
并且由于都是正数那么sum是单调递增的,由此可以进行求解。

如果sum[i]-sum[j]=m 即 j-1 到i 为解
如果>m 说明大了,让j+1

代码如下

program p1147;var m,i,j:longint;    sum:array[1..20000000] of int64;begin readln(m); sum[1]:=1; for i:=2 to m-1 do  begin   sum[i]:=sum[i-1]+i;  end; i:=1; j:=1; while i<=m do  begin   if sum[i]-sum[j]=m    then     begin      writeln(j+1,' ',i);      i:=i+1;      j:=j+1;     end    else     begin      if sum[i]-sum[j]>m       then        begin         j:=j+1;        end       else        begin         i:=i+1;        end;     end;  end;end.

在草稿箱里忘了。。。(⊙﹏⊙)b


这里写图片描述


这里写图片描述

我不知道风是在哪一个方向吹

    ————徐志摩

我不知道风
是在哪一个方向吹——
我是在梦中,
在梦的轻波里依洄。
我不知道风
是在哪一个方向吹——
我是在梦中,
她的温存,我的迷醉。
我不知道风
是在哪一个方向吹——
我是在梦中,
甜美是梦里的光辉。
我不知道风
是在哪一个方向吹——
我是在梦中,
她的负心,我的伤悲。
我不知道风
是在哪一个方向吹——
我是在梦中,
在梦的悲哀里心碎!
我不知道风
是在哪一个方向吹——
我是在梦中,
黯淡是梦里的光辉。
注:这首诗写于1928年,初载同年3月10日《新月》月刊第一卷第1号,署名志摩。[1]

0 0