zoukankan      html  css  js  c++  java
  • 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.
    
  • 相关阅读:
    对图像边缘进行随机均匀采样的C#算法实现
    [淡藤]最近几年在Chinapub上买的书
    重新认识C#: 玩转指针
    又是一年春来到
    需求定律在起着作用
    haha, 愚人节听鱼人歌
    名字就叫奥格工作室!
    effective c++ 第六章
    com 名字对象(1)IBindCtx
    com 名字对象(2)创建名字对象(IMoniker)
  • 原文地址:https://www.cnblogs.com/Chuckqgz/p/4607814.html
Copyright © 2011-2022 走看看