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. for i:= 1 to N do begin divisori[i]:=0;freq[i]:=0; end; C:=0; h:=1; ricordaindice:=0;
  42. ordinamento (1,N,numeri, true);
  43. for i:=1 to N do if K mod numeri[i]= 0 then begin divisori[h]:=numeri[i]; h:=h+1; end;
  44. for i:=1 to h-1 do write(divisori[i],' '); writeln;
  45. i:=1; while divisori[i]<=trunc(sqrt(K)) do i:=i+1; ricordaindice:=i-1;
  46.  
  47. writeln('ricid ',ricordaindice);
  48. for i:=1 to ricordaindice do freq[divisori[i]]:=freq[divisori[i]]+1;
  49. for i:=1 to ricordaindice do write(freq[divisori[i]],' ');writeln;
  50. for i:=ricordaindice +1 to N do begin x:=K div divisori[i]; writeln ('ciao ',x,' ',freq[x]); C:=C+freq[x]; end;
  51. writeln(C);
  52. end.
  53.  
Success #stdin #stdout 0s 5324KB
stdin
8 1000000000000
40000000000 125000000000
1600000000 10000000000 100 25
625 8
stdout
8 25 100 625 1600000000 10000000000 40000000000 125000000000 
ricid 4
1 1 1 1 
ciao 625 1
ciao 100 1
ciao 25 1
ciao 8 1
4