由于本题的n的范围为[1,20],在枚举每一种方案的时候,最多为2^20,近似为1000*1000,接近1e6的复杂度,所以用dfs枚举每一种方案的方法可行。
用dfs枚举每一种方案,然后当枚举完其中的一个方案时,在计算在该方案中1的个数的时候可以用lowbit函数来进行操作(lowbit函数是记录该数的二进制中最后一位1的位置)
#include<iostream>
#define int long long
using namespace std;
typedef long long ll;
const int N=40;
int a[N];
int res;
int n;
int k;
int lowbit(int x)
{
return x&(-x);
}
void dfs(int u,int sum)
{
if(u==n)
{
int cnt=0;
while(sum)
{
sum-=lowbit(sum);//求出该方案中1的个数
cnt++;
}
if(cnt==k) res++;
return;
}
dfs(u+1,sum);//不选择该数字
dfs(u+1,sum&a[u]);//选择该数字
}
signed main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
dfs(0,(1ll<<63)-1);//这里将开始时设定为全为1,方便后续进行数字的操作 任何数对该数进行与
//操作后结果都为任何数
printf("%lld",res);
}