program password;
const MAXN = 10000000;
type elenco = array[1..MAXN] of qword;
var N,K,i,h, C, x, ricordaindice, inizioricordaid, finericordaid, countrad :  qword;
    numeri, freq, divisori :elenco;
procedure scambia (var x,y: qword);
var t:qword;
begin
   t:=x;
   x:=y;
   y:=t;
end;  
Procedure ordinamento (estremoi,estremos: qword; var v : elenco; ordinato:boolean);
var inf, sup, medio:qword;
    pivot :qword;
begin
    inf:=estremoi;
    sup:=estremos;
    medio:= (estremoi+estremos) div 2;
    pivot:=v[medio];
    repeat
      if (ordinato) then
         begin
            while (v[inf]<pivot) do  inf:=inf+1;
            while (v[sup]>pivot) do  sup:=sup-1;
         end;
      if inf<=sup then
       begin
         scambia(v[inf],v[sup]);
         inf:=inf+1;
         sup:=sup-1;
       end;
    until inf>sup;
    if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
    if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
end;   

begin
	readln(N,K);
	for i:=1 to N do read (numeri[i]); readln;
	for i:= 1 to N do begin divisori[i]:=0;freq[i]:=0; end; C:=0; h:=1; inizioricordaid:=0; finericordaid:=0; countrad:=0;
	ordinamento (1,N,numeri, true); 
	for i:=1 to N do if K mod numeri[i]= 0 then begin divisori[h]:=numeri[i];  h:=h+1;  end;
    for i:=1 to h-1 do write(divisori[i],' '); writeln;
    i:=1; while divisori[i]<trunc(sqrt(K)) do i:=i+1; inizioricordaid:=i; 
    i:=inizioricordaid; while divisori[i]=(sqrt(K)) do begin countrad:=countrad+1; i:=i+1; end;
    if countrad=1 then C:=1
                  else if countrad>1 then C:=(countrad*(countrad-1)) div 2;
    finericordaid:=i; 
    writeln('ricid ',inizioricordaid,' ', finericordaid);
    for i:=1 to inizioricordaid -1 do  freq[divisori[i]]:=freq[divisori[i]]+1;
    for i:=1 to inizioricordaid -1 do write(freq[divisori[i]],' ');writeln; 
    
                       
    writeln(C);
end.
