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