Cod sursa(job #862610)

Utilizator alex45meOlaru Alex alex45me Data 22 ianuarie 2013 20:09:58
Problema Suma si numarul divizorilor Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.85 kb
var t:integer;
    f,g:text;
    i,k:longint;
    n:int64;
    p:array[1..1000005] of boolean;
    x:array[1..500005] of longint;
 
procedure ciur;
const nmax=1000005;
var i,j:longint;
begin
  for i:=2 to nmax do
    if not p[i] then
      begin
        j:=i+i;
        k:=k+1;
        x[k]:=i;
          while j<nmax do
            begin
              p[j]:=true;
              j:=j+i;
            end;
      end;
end;
 
procedure solve(n:int64);
const md=9973;
var i,nr,d,y:longint;
    s,s1:int64;
 
  function putere(a,b:longint):int64;
  var i:longint;
  begin
    putere:=a;
    for i:=2 to b do
      putere:=(putere*a);
  end;
 
begin
  nr:=1;
  s:=1;
  s1:=1;
  i:=1;
  d:=0;
  y:=trunc(sqrt(n));
  while x[i]<=y do
    if n mod x[i]=0 then
      begin
        n:=n div x[i];
        d:=d+1;
      end
    else
      begin
        if d>0 then
          begin
            nr:=nr*(d+1);
            s:=(s*(putere(x[i],d+1)-1));
            s1:=(s1*(x[i]-1));
            s:=(s div s1) mod md;
            s1:=1;
            d:=0;
            if n=1 then
              break;
            if n<1000003 then
              if not p[n] then
                begin
                  nr:=nr*2;
                  s1:=s1*(n-1);
                  s:=((s*(putere(n,2)-1))div s1) mod md;
                  n:=1;
                  s1:=1;
                  break;
                end;
 
          end;
        i:=i+1;
      end;
  if (n>1)and(not p[n]) then
    begin
      nr:=nr*2;
      s:=(s*(putere(n,2)-1));
      s1:=(s1*(n-1));
    end;
  s:=(s div s1) mod md;
  writeln(g,nr,' ',s);
end;
 
begin
  ciur;
  assign(f,'ssnd.in');
  reset(f);
  assign(g,'ssnd.out');
  rewrite(g);
  readln(f,t);
  for k:=1 to t do
    begin
      readln(f,n);
      solve(n);
    end;
  close(f);
  close(g);
end.