Cod sursa(job #1419294)

Utilizator ButnaruButnaru George Butnaru Data 15 aprilie 2015 12:18:27
Problema Suma si numarul divizorilor Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.36 kb
program ssnd;
const maxprim=trunc(1e5);
      modd=9973;
type vector1=array[0..maxprim+1] of byte;
     vector2=array[0..80001] of longint;
     buf=array[0..1 shl 17] of char;
var t:vector1; prime:vector2; ff1,ff2:buf;
    n,i,j,nr,sol2,sol1,sum,term,l,prim,max:longint; x:qword;
    f1,f2:text;
procedure ciur(n:longint);
begin
i:=2;
while i<=1000 do begin
if t[i]=0 then begin
j:=i*i;
while j<=n do begin
t[j]:=1; j:=j+2*i;
end;
end;
i:=i+1;
end;
prime[1]:=2; nr:=1; i:=3;
while i<=maxprim do begin
if t[i]=0 then begin nr:=nr+1; prime[nr]:=i; end;
i:=i+2;
end;
end;
begin
assign (f1,'ssnd.in');
assign (f2,'ssnd.out');
reset (f1);
rewrite (f2);
settextbuf(f1,ff1);
settextbuf(f2,ff2);
readln (f1,n);
ciur(maxprim);
for i:=1 to n do begin
readln (f1,x); j:=1; sol1:=1; sol2:=1; max:=trunc(sqrt(x));
while (x>1) and (prime[j]<=max) and (j<=nr) do begin
while (j<=nr) and (x mod prime[j]<>0) do j:=j+1;
l:=0; sum:=1; term:=1;
if (j>nr) then break;
prim:=prime[j] mod modd;
while x mod prime[j]=0 do begin l:=l+1; x:=x div prime[j];
term:=term*prim; sum:=(sum+term) mod modd;
if term>=modd then term:=term mod modd;
if sum>=modd then sum:=sum mod modd;
end;
sol1:=sol1*(l+1) mod modd; sol2:=sol2*sum mod modd;
end;
if x>1 then begin sol1:=sol1*2; sol2:=sol2*(x+1) mod modd; end;
writeln (f2,sol1,' ',sol2);
end;
close (f1);
close (f2);
end.