这个题得用一下位运算‘&’的性质:若c=a&b,则c<=a && c<=b;而且搜索时从小数开始也能剪掉不少。
设置long long最大值时可以这么写
const long long MAX=(~(0ULL)>>1);
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=45;
const long long MAX=(~(0ULL)>>1);
int t,c,n,k;
long long a[N],ans;
void dfs(int t,int d,long long num){
if(ans>num)ans=num;
if(d==k||t==n+1)return;
long long s=num;
for(int i=t;i<=n;i++)s&=a[i];
if(s>=ans)return;
dfs(t+1,d+1,num&a[t]);
dfs(t+1,d,num);
}
int main(){
cin>>t; c=0;
while(t--) {
printf("Case #%d: ",++c);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
sort(a+1,a+n+1);
ans=MAX;
dfs(1,0,MAX);
printf("%I64d\n",ans);
}
}