51NOD-1315位运算

#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);
}

猜你喜欢

转载自blog.csdn.net/qq_37699336/article/details/79025298