题意:
给你n个集合,每个集合m个数,再给你一个慨率s
问所有数任意组合成的集合在n个集合中出现次数大于 s&n的有多少。
sb超级阅读理解题。
题解:
每个数用二进制记录他分别出现在那些集合里,因为集合最大50.so ll可以存下。
然后依次枚举任意的数组合, 就是相互& ,& 完就结束了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[30];
int test,cnt=0,con,n;
ll ans=0;
ll inf=(1ll<<55)-1;
bool check(ll stat,ll num){
int ret=0;
ll t=stat#
while(t){
if(t&1) ret++;
t>>=1;
}
return ret>=con;
}
void dfs(ll stat,ll num){
if(num>n) return ;
dfs(stat,num+1);
if(check(stat,a[num])){
ans++;
dfs(stat&a[num],num+1);
}
}
int main(){
char c;
double xing,k;
cin>>n>>xing;
getchar();
while(~scanf("%d%c",&test,&c)){
a[test]|=(1<<cnt);
if(c=='\n'||c!=' '){
cnt++;
}
}
k=xing*cnt;
if(k-(ll)k>0) con=k+1;
else con=k;
dfs(inf,1);
cout<<ans<<endl;
return 0;
}