链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
WY是一个序列大师,他喜欢研究一些和序列相关的操作。时间长了,WY对某一些特定的序列产生了感情,换句话说,WY喜欢和这些特定的序列打交道。比如说WY最近就迷上了这样一类序列:
-
我们规定序列的与和定义为序列中所有元素按位与得到的结果。
-
如序列 [1,2,3] :其与和结果为1&2&3=0.
-
- 若一个序列与和的结果,其二进制表示形式下包含 k 个 1 ,WY则会认为这是他喜欢的序列
现在WY的手里有一个序列了,他想知道,这个的序列的非空子序列中有多少个他喜欢的序列。由于WY已经非常熟悉这类序列了,所以他想考考你,看看你是否能解决这个问题。
子序列定义为:从原序列中去除几个(可以为零个)元素后得到的序列。
输入描述
输出描述
示例
输入
3 6
2 4 1
输出
0
说明
对于样例,其子序列有:
[2]:其与和为10(二进制),仅包含一个1,不为6,所以对答案贡献为零
[2,4]:与和为 0 ,同理,贡献为零。
[2,1]:与和结果0
[2,4,1]:与和结果0
[4]:与和结果100
[4,1]:与和结果0
[1]:与和结果1
综上,答案为0。
思路
首先n,k的范围都很小,所以可以直接dfs枚举所有情况即可。这里我用到了一个STL容器——bitset,我觉得用它来处理二进制挺好用的,里面count()函数是直接可以计算出二进制1的个数。
在这里我稍微介绍一下bitset:
std::bitset
是 C++ 标准库中的一个类,用于表示二进制位序列。它提供了一种方便的方式来处理二进制数据,尤其适用于位运算操作。std::bitset
是 C++ 标准库中的一个类,用于表示二进制位序列。它提供了一种方便的方式来处理二进制数据,尤其适用于位运算操作。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[20];
int ans,n,k;
void dfs(int x,int len)
{
if(bitset<64>(x).count()==k) ans++;
for(int i=len+1;i<n;i++)
dfs(x&a[i],i);
return ;
}
signed main(){
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
dfs(a[i],i);
}
cout<<ans;
}