#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=1000000000;
long long ji[105];
long long aa[105];
int main()
{
long long m,ls,a;
long long n;
scanf("%lld %lld",&n,&m);
ls=m;
long long cnt=0;
while(ls){
aa[++cnt]=ls%2;
ls/=2;
}//z号出这个数m对应的二进制的数。 //对应的每一位能提供的0或是1的个数找出最小的
memset(ji,0,sizeof(ji));
int id,flag;
for(int i=1;i<=n;i++)
{
id=1;
flag=0;
scanf("%lld",&a);
if(a>m||(a|m)>m) continue; //(a|m)>m这个特别重要 试试就出来了在这wa死了
while(a){ //当m的其中一位为0 输入的a对应位置为1 则就不用删除这个
int j=a%2; //因为无论哪个于这个都不会等于m
a/=2;
if(j==aa[id]){
ji[id]++;
}
id++;
}
}
long long min1=inf;
for(int i=1;i<=cnt;i++)
{
min1=min(min1,ji[i]);
}
printf("%lld\n",min1);
}
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=1000000000;
long long ji[105];
long long aa[105];
int main()
{
long long m,ls,a;
long long n;
scanf("%lld %lld",&n,&m);
ls=m;
long long cnt=0;
while(ls){
aa[++cnt]=ls%2;
ls/=2;
}//z号出这个数m对应的二进制的数。 //对应的每一位能提供的0或是1的个数找出最小的
memset(ji,0,sizeof(ji));
int id,flag;
for(int i=1;i<=n;i++)
{
id=1;
flag=0;
scanf("%lld",&a);
if(a>m||(a|m)>m) continue; //(a|m)>m这个特别重要 试试就出来了在这wa死了
while(a){ //当m的其中一位为0 输入的a对应位置为1 则就不用删除这个
int j=a%2; //因为无论哪个于这个都不会等于m
a/=2;
if(j==aa[id]){
ji[id]++;
}
id++;
}
}
long long min1=inf;
for(int i=1;i<=cnt;i++)
{
min1=min(min1,ji[i]);
}
printf("%lld\n",min1);
}