Cod sursa(job #426505)

Utilizator amaliutzzaGoia Amalia amaliutzza Data 27 martie 2010 09:27:59
Problema Suma si numarul divizorilor Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.79 kb
program suma_si_numarul_divizorilor;
const max=1000000;

var f,g:Text;
    ciur:array[1..max]of integer;
    n,sum,nrd,p:int64;
    t,i,j,k:longint;

procedure sieve;                 {!} {ciurul lui Erathostene} {!}
var i,j:longint;
begin
  for i:=1 to max do              {pun 1 daca e prim si 0 daca nu e prim}
    ciur[i]:=1;                   {initial presupun ca toate sunt prime}
  i:=2;                           {pornesc cu 2 si marchez toti multiplii}
  while i*i<=max do               {lui ca fiind neprimi. Cat timp mai am numere}
    begin                         {prime ale caror multiplii nu i-am marcat...}
      if ciur[i]=1 then           {daca nu e marcat deja ca fiind neprim}
        begin                     {marchez toti multimplii lui i ca fiind}
          j:=2;                   {neprimi, fara a trece peste max}
          while i*j<max do
            begin
              ciur[i*j]:=0;
              inc(j);
            end;
        end;
      inc(i);
    end;
end;

function pow(a,b:longint):longint;
var i:longint;
begin
  pow:=a;
  for i:=2 to b do
    pow:=pow*a;
end;

procedure rezolvare(n:longint);
begin
  sum:=1;
  nrd:=1;
  j:=2;
  while n>1 do
    begin
      while ciur[j]=0 do
        inc(j);
      p{puterea}:=0;
      while n mod j=0 do
        begin
          inc(p);
          n:=n div j;
        end;
      nrd{numarul divizorilor}:=nrd*(p+1);
      {calculez j la puterea p+1}
      {pow(j,p+1)}
      sum:=sum*( (pow(j,p+1)-1) div (j-1) );
      inc(j);
    end;
  writeln(g,nrd,' ',sum mod 9973);
end;

begin
  assign(f,'ssnd.in'); reset(f);
  assign(g,'ssnd.out'); rewrite(g);
    readln(f,t);
    sieve;
    for i:=1 to t do
      begin
        readln(f,n);
        rezolvare(n);
      end;
  close(f); close(g);
end.