program password;
const MAXN = 10000000;
      M = 1000000007;
type elenco = array[1..MAXN] of qword;
var N,K,i,h,C,w,ricordaid, 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; h:=1; C:=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;
    i:=1; while divisori[i]<sqrt(K) do i:=i+1; ricordaid:=i-1; 
    for i:=ricordaid +1  to h-1 do
                     begin 
                         if divisori[i]=sqrt(K) then countrad:=countrad+1
                                                else if divisori[i]>sqrt(K) then begin w:=K div divisori[i]; freq[w]:=freq[w]+1;  end; 
                     end;
   for i:=1 to ricordaid do  C:=C+ freq[divisori[i]]; 
    C:=C+(countrad*(countrad-1)) div 2;
    writeln(C mod M);
end.
