Cod sursa(job #115759)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 16 decembrie 2007 22:00:55
Problema Pairs Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.62 kb
var fi,fo:text;
    n,x,nr_div,i,j,max:longint;
    ct:byte;
    rez:int64;
    nr:array[1..1000010]of byte;
    m:array[1..1000010]of longint;
    prime:array[1..1001000]of byte;
procedure gen;
var i,j:longint;
begin
  i:=3;
  prime[1]:=1;
  while i<=1000010 do
    begin
      if prime[i]=0 then
        begin
          j:=3*i;
          while j<=1000010 do
             begin
                prime[j]:=1;
                inc(j,i);
             end;
        end;
      inc(i,2);
    end;
end;
procedure prim(nr:longint);
var i:longint;
begin
  i:=3; nr_div:=1; ct:=1;
  if (nr=2)or((prime[nr]<>1)and(nr and 1=1)) then exit;
  if nr and 1=0 then inc(nr_div);
  while i<=trunc(sqrt(nr)) do
    begin
      if (nr mod sqr(i)=0) then begin ct:=2; exit; end;
      if (nr mod i=0) then begin inc(nr_div); nr:=nr div i; end;
      inc(i,2);
    end;
end;
procedure verif(i:longint);
begin
  prim(i);
  if ct=1 then
    if nr_div and 1 = 1 then rez:=rez + (m[i]*(m[i]-1)) shr 1
                        else rez:=rez - (m[i]*(m[i]-1)) shr 1;
end;
begin
  assign(fi,'pairs.in'); reset(fi);
  assign(fo,'pairs.out'); rewrite(fo);
  readln(fi,n);
  rez:=0; max:=-maxint;
  m[1]:=0;
  gen;
  for i:=1 to n do
    begin
      readln(fi,x);
      {if x and 1=0 then inc(m[2]);}
      nr[x]:=1;
      {if max<x then max:=x;}
    end;
  {if (m[2]>0) then verif(2);}
  for i:=2 to 1000000 do
    begin
      for j:=1 to 1000000 div i do
         if nr[i*j]=1 then inc(m[i]);
      if (m[i]>0) then verif(i);
    end;
  rez:=(n*(n-1) shr 1) - rez;
  writeln(fo,rez);
  close(fi); close(fo);
end.