fork download
  1. program password;
  2. const MAXN = 10000000;
  3. type elenco = array[1..MAXN] of qword;
  4. var N,K,i,h, C, x, ricordaindice : qword;
  5. numeri, freq, divisori :elenco;
  6. procedure scambia (var x,y: qword);
  7. var t:qword;
  8. begin
  9. t:=x;
  10. x:=y;
  11. y:=t;
  12. end;
  13. Procedure ordinamento (estremoi,estremos: qword; var v : elenco; ordinato:boolean);
  14. var inf, sup, medio:qword;
  15. pivot :qword;
  16. begin
  17. inf:=estremoi;
  18. sup:=estremos;
  19. medio:= (estremoi+estremos) div 2;
  20. pivot:=v[medio];
  21. repeat
  22. if (ordinato) then
  23. begin
  24. while (v[inf]<pivot) do inf:=inf+1;
  25. while (v[sup]>pivot) do sup:=sup-1;
  26. end;
  27. if inf<=sup then
  28. begin
  29. scambia(v[inf],v[sup]);
  30. inf:=inf+1;
  31. sup:=sup-1;
  32. end;
  33. until inf>sup;
  34. if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
  35. if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
  36. end;
  37.  
  38. begin
  39. readln(N,K);
  40. for i:=1 to N do read (numeri[i]); readln;
  41.  
  42. for i:= 1 to N do begin divisori[i]:=0;freq[i]:=0; end; C:=0; h:=1; ricordaindice:=0;
  43. ordinamento (1,N,numeri, true);
  44. for i:=1 to N do if K mod numeri[i]= 0 then begin divisori[h]:=numeri[i]; h:=h+1; end;
  45. i:=1; while divisori[i]<=trunc(sqrt(K)) do i:=i+1; ricordaindice:=i-1;
  46. for i:=1 to ricordaindice do freq[divisori[i]]:=freq[divisori[i]]+1;
  47. for i:=ricordaindice +1 to N do begin x:=K div divisori[i]; writeln ('ciao ',x,' ',freq[divisori[x]]); C:=C+freq[divisori[x]]; end;
  48. writeln(C);
  49. end.
Success #stdin #stdout 0s 5316KB
stdin
4 12
2 4 3 6
stdout
ciao 3 0
ciao 2 1
1