//一开始没有理解题意 以为只是从原序列中截取 其实是从中找出数字重新组成新序列
//此题考查: 排序,(二分)查找
//max(a,b)可直接用
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
long p;
long tmp;
vector<long> vt;
/*
int binary_search(vector<long> v,int begin, int end, long value)
{
while (begin <= end)
{
int mid = (begin + end) / 2;
if (v[mid] == value)
return mid;
else
if (value < v[mid])
end = mid - 1;
else
begin = mid + 1;
}
return -1;
}
*/
int main()
{
cin >> n >> p;
for (int i = 0; i < n; i++)
{
cin >> tmp;
vt.push_back(tmp);
}
sort(vt.begin(), vt.end());
/* 这样查找方法一个3point点会超时,只能用二分查找
long max = 1;
for (int i = 0; i < n; i++){
if (n - i<max) break;
int len = 1;
while (i + len<n&&vt[i] * p >= vt[i + len])
++len;
if (len>max)
max = len;
}
cout << max;
*/
int len = 1;
for (int i = 0; n - i > len; i++)
{
long target = vt[i] * p;
int begin = i, end = n - 1;
while (begin <= end)
{
int mid = (begin + end) / 2;
if (vt[mid] == target)
{
len = max(len, mid - i + 1);
begin = mid + 1;
/*
这样为何3 point点错误呢???
while (++mid<n){
if (vt[mid] == target) len++;
else break;
}
break;
*/
}
else if (vt[mid] > target)
end = mid - 1;
else
{
len = max(len, mid - i + 1);
begin = mid + 1;
}
}
}
cout << len;
return 0;
}