jzoj 1401. 【2012.03.09普及组】约数和

lzusa 发布于 2019-03-23 1086 次阅读


 

题目描述

给你一个数N,需要你算出这个数所有约数的和。(N的约数指能整除N的正整数),例如12的约数有1,2,3,4,6,12。所以约数和为1+2+3+4+6+12=28

 

输入

本题有多组数据,第一行一个T,表示有T组数据,下面T行,每行一个正整数N表示要处理的数。

输出

T行,每行一个正整数表示输入中对应的数的约数和。

 

记录每一个上一次找过的数,如果有重复的直接输出,然后会出现j*j=x的情况,这是只用加一个就可以了

var
  f:array[-1..10000000] of int64;
  i,j,k,n,m,s:longint;
begin
  readln(n);
  for i:=1 to n do
    begin
      readln(m);
      if f[m]=0 then
        begin
          for j:=1 to trunc(sqrt(m)) do
          begin
            if m mod j=0 then
            if j*j=m then f[m]:=f[m]+j else
           f[m]:=f[m]+j+m div j;
          end;
        end;
      writeln(f[m]);
    end;
end.

 

]]>