Cod sursa(job #1199523)

Utilizator atatomirTatomir Alex atatomir Data 19 iunie 2014 16:38:42
Problema Suma si numarul divizorilor Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.65 kb
const def=705000;
      modd=9973;
var t,ti:longint;
    i:longint;
    c:array[0..def+5]of boolean;
    prim:array[0..80000]of longint;
    nr,sum,p,d,n,h,l,cnt:int64;
    bufin,bufout:array[1..65000]of byte;

procedure ciur();
var i,hh,j,h:longint;
begin
  prim[0] := 0;
  for i := 2 to def do
    c[i] := true;
  h := trunc(sqrt(def));
  for i := 2 to h do
    if c[i] then
    begin
      hh := def div i;
      for j := i to hh do c[i*j] := false;
    end;
  for i := 1 to def do
    if c[i] then
    begin
      inc(prim[0]); prim[prim[0]] := i;
    end;
end;

function up(a,b:int64):int64;
var x:int64;
begin
  if b > 1 then x := up(a,b div 2) else x := 1;
  if b mod 2 = 0 then
    up := x*x
  else
    up := x*x*a;
end;

begin
  assign(input,'ssnd.in'); reset(input);
  assign(output,'ssnd.out'); rewrite(output);
  settextbuf(input,bufin);
  settextbuf(output,bufout);

  ciur();

  readln(t);
  for ti := 1 to t do
  begin
    readln(n);
    nr := 1; sum := 1;
    h := trunc(sqrt(n));
    i := 0;
    while (prim[i+1] <= h)and(n<>1) do
    begin
      inc(i);
      p := 1; d := prim[i];

      while n mod prim[i] = 0 do   // determinare cu ridicare in timp O(log)
      begin
        inc(p);
        n := n div prim[i];
      end;

      d := up(prim[i],p);

      nr := (nr * p)mod modd;
      sum := (sum * ((d-1) div (prim[i]-1)))mod modd;
      h := trunc(sqrt(n));
    end;
    if n <> 1 then
    begin
      nr := nr * 2; nr := nr mod modd;
      sum := sum * ((n*n-1) div (n-1)); sum := sum mod modd;
    end;

    writeln(nr,' ',sum);

  end;


  close(input);
  close(output);
end.