由于本题的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);
}