Cod sursa(job #636720)

Utilizator Buzu_Tudor_RoCont vechi Buzu_Tudor_Ro Data 19 noiembrie 2011 22:46:05
Problema Suma si numarul divizorilor Scor 30
Compilator fpc Status done
Runda Arhiva educationala Marime 2.58 kb
Program divizori_teorie_numere;
type vector=array[1..10000000] of boolean;
var fi,fo:text;
    a,nr,p: array[1..10000000] of longint;
    i,j,i1,d:longint;
    max,n,k:longint;
    sum,d2:real;


procedure eratostene(m:longint);
var i0,j0,r:longint;
    t:vector;
begin
      for i0:=2 to m do t[i0]:=true;
      for i0:=2 to trunc(sqrt(m)) do
                      if t[i0]=true then
                            for j0:=2 to m div i0 do t[i0*j0]:=false;
      r:=0;
      for i0:=2 to m do if t[i0] then begin
                                       r:=r+1;
                                       p[r]:=i0;
                                       end;
end;

begin
     assign(fi,'ssnd.in'); reset(fi); readln(fi,n);
     assign(fo,'ssnd.out'); rewrite(fo);

     if n=1 then begin
                 read(fi,nr[1]);   k:=0;
                 for i:=2 to nr[1] do if nr[1] mod i = 0 then k:=k+1;
                 writeln(fo,k);
                 end
            else begin
                 readln(fi,nr[1]); max:=nr[1];
                 for i:=2 to n do begin
                                  read(fi,nr[i]);
                                  if nr[i]>max then max:=nr[i];
                                  end;
                 eratostene(max);

                 for i:=1 to n do begin
                                  for j:=1 to nr[i] do a[j]:=0;
                                  j:=1;    sum:=1;
                                  while nr[i]<>1 do begin
                                                d2:=1;
                                                if (nr[i] mod p[j]=0) then
                                                                      while nr[i] mod p[j] = 0 do begin
                                                                                              a[j]:=a[j]+1; d2:=d2*p[j];
                                                                                              nr[i]:=nr[i] div p[j];
                                                                                              end;

                                                d2:=trunc((d2*p[j]-1)/(p[j]-1));
                                                sum:=sum*d2;
                                                j:=j+1;
                                                end;
                                  d:=1;
                                  for i1:=1 to j do if a[i1]<>0 then d:=d*(a[i1]+1);
                                  writeln(fo,d,' ',(trunc(sum)) mod 9973);

                                  end;
                 end;

     close(fi); close(fo);
end.