Cod sursa(job #636720)
Utilizator | Cont 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.