• P1147连续自然数和


    洛谷1147 连续自然数和

    题目描述

    对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M。
    例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。

    输入输出格式

    输入格式:

    包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)。

    输出格式:

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

    输入输出样例

    输入样例1:

    combo.in
    10000

    输出样例1:

    combo.out
    18 142
    297 328
    388 412
    1998 2002
    洛谷1147



    在学校机房写的
    把在学校的思路写下

    首先,第一个想的是枚举,但是明显会TLE,于是我先列了下
    ANS=i+i+1+i+2+...+i+j
    =ij+1+2+...+j

    然后把1+..+j存储到数组f[j]中,那么就可以得到:
    ANS=ij+A[j]

    这个应该是哈希表吧?

    于是得到程序

    program	p1147;
    type
    		LL=longint;
    var
    	 j,n,i:LL;
       f:array[0..2020]of LL;
    procedure init;
    var
    	 i:LL;
    begin
         f[0]:=0;
         for i:=1 to 2000 do f[i]:=f[i-1]+i;
    end;
    
    begin
         assign(input,'p1147.in');
         assign(output,'p1147.out');
         reset(input);
         rewrite(output);
         readln(n);
         init;
         for i:=1 to n div 2 do
         begin
              j:=round(n/i);
              if j>2000 then j:=2000;
              while j>0 do
              begin
                  if f[j-1]+j*i=n
                  	then begin
                  	   if i=1 then begin
                         writeln(0,' ',i+j-1);
                         writeln(1,' ',i+j-1);
                       end
                       else writeln(i,' ',i+j-1);
                       break;
                   	end;
                  dec(j);
              end;
         end;
         close(input);
         close(output);
    end.
    
  • 相关阅读:
    maven 常用编译
    java 秒时间格式化
    git clone 带用户名密码
    Filebeat占用内存和CPU过高问题排查
    新的一周,全新的开始.
    vs2008 打开aspx文件时设计界面死机情况的解决
    php面试题及答案
    JQuery 对html控件操作总结
    网页常用Javascript
    针对修改php_ini不起作用的方案
  • 原文地址:https://www.cnblogs.com/Chuckqgz/p/4607814.html
Copyright © 2020-2023  润新知