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.
cHJvZ3JhbSBwYXNzd29yZDsKY29uc3QgTUFYTiA9IDEwMDAwMDAwOwogICAgICBNID0gMTAwMDAwMDAwNzsKdHlwZSBlbGVuY28gPSBhcnJheVsxLi5NQVhOXSBvZiBxd29yZDsKdmFyIE4sSyxpLGgsQyx3LHJpY29yZGFpZCwgY291bnRyYWQgOiAgcXdvcmQ7CiAgICBudW1lcmksIGZyZXEsIGRpdmlzb3JpIDplbGVuY287CnByb2NlZHVyZSBzY2FtYmlhICh2YXIgeCx5OiBxd29yZCk7CnZhciB0OnF3b3JkOwpiZWdpbgogICB0Oj14OwogICB4Oj15OwogICB5Oj10OwplbmQ7ICAKUHJvY2VkdXJlIG9yZGluYW1lbnRvIChlc3RyZW1vaSxlc3RyZW1vczogcXdvcmQ7IHZhciB2IDogZWxlbmNvOyBvcmRpbmF0bzpib29sZWFuKTsKdmFyIGluZiwgc3VwLCBtZWRpbzpxd29yZDsKICAgIHBpdm90IDpxd29yZDsKYmVnaW4KICAgIGluZjo9ZXN0cmVtb2k7CiAgICBzdXA6PWVzdHJlbW9zOwogICAgbWVkaW86PSAoZXN0cmVtb2krZXN0cmVtb3MpIGRpdiAyOwogICAgcGl2b3Q6PXZbbWVkaW9dOwogICAgcmVwZWF0CiAgICAgIGlmIChvcmRpbmF0bykgdGhlbgogICAgICAgICBiZWdpbgogICAgICAgICAgICB3aGlsZSAodltpbmZdPHBpdm90KSBkbyAgaW5mOj1pbmYrMTsKICAgICAgICAgICAgd2hpbGUgKHZbc3VwXT5waXZvdCkgZG8gIHN1cDo9c3VwLTE7CiAgICAgICAgIGVuZDsKICAgICAgaWYgaW5mPD1zdXAgdGhlbgogICAgICAgYmVnaW4KICAgICAgICAgc2NhbWJpYSh2W2luZl0sdltzdXBdKTsKICAgICAgICAgaW5mOj1pbmYrMTsKICAgICAgICAgc3VwOj1zdXAtMTsKICAgICAgIGVuZDsKICAgIHVudGlsIGluZj5zdXA7CiAgICBpZiAoZXN0cmVtb2k8c3VwKSB0aGVuIG9yZGluYW1lbnRvKGVzdHJlbW9pLHN1cCx2LG9yZGluYXRvKTsKICAgIGlmIChpbmY8ZXN0cmVtb3MpIHRoZW4gb3JkaW5hbWVudG8oaW5mLGVzdHJlbW9zLHYsb3JkaW5hdG8pOwplbmQ7ICAgCgpiZWdpbgoJcmVhZGxuKE4sSyk7Cglmb3IgaTo9MSB0byBOIGRvIHJlYWQgKG51bWVyaVtpXSk7IHJlYWRsbjsKCWZvciBpOj0gMSB0byBOIGRvIGJlZ2luIGRpdmlzb3JpW2ldOj0wO2ZyZXFbaV06PTA7IGVuZDsgaDo9MTsgQzo9MDsgY291bnRyYWQ6PTA7IAoJb3JkaW5hbWVudG8gKDEsTixudW1lcmksIHRydWUpOyAKCWZvciBpOj0xIHRvIE4gZG8gaWYgSyBtb2QgbnVtZXJpW2ldPSAwIHRoZW4gYmVnaW4gZGl2aXNvcmlbaF06PW51bWVyaVtpXTsgIGg6PWgrMTsgIGVuZDsKICAgIGk6PTE7IHdoaWxlIGRpdmlzb3JpW2ldPHNxcnQoSykgZG8gaTo9aSsxOyByaWNvcmRhaWQ6PWktMTsgCiAgICBmb3IgaTo9cmljb3JkYWlkICsxICB0byBoLTEgZG8KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXZpc29yaVtpXT1zcXJ0KEspIHRoZW4gY291bnRyYWQ6PWNvdW50cmFkKzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiBkaXZpc29yaVtpXT5zcXJ0KEspIHRoZW4gYmVnaW4gdzo9SyBkaXYgZGl2aXNvcmlbaV07IGZyZXFbd106PWZyZXFbd10rMTsgIGVuZDsgCiAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgZm9yIGk6PTEgdG8gcmljb3JkYWlkIGRvICBDOj1DKyBmcmVxW2Rpdmlzb3JpW2ldXTsgCiAgICBDOj1DKyhjb3VudHJhZCooY291bnRyYWQtMSkpIGRpdiAyOwogICAgd3JpdGVsbihDIG1vZCBNKTsKZW5kLgo=