codeforces Gym 101063 C

时间:2023-03-10 04:53:59
codeforces Gym 101063 C

二进制转十进制 然后按位比较

传送门 http://codeforces.com/gym/101063

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
using namespace std;
const int maxn= ;
const double eps= 1e-;
const int inf = 0x3f3f3f3f;
const int mod =;
typedef long long ll;
typedef long double ld;
int n,m;
int a[maxn][];
int b[maxn];
ll c[maxn];
ll d[maxn];
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(b,,sizeof(b));
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
int t;
scanf("%d",&t);
for(int j=;j<=t;j++)
{
scanf("%d",&a[i][j]);
b[i]+=(<<(a[i][j]-));
}
c[b[i]]++;
}
for(int i=;i<=;i++)
{
int k=i;
d[i]=;
while(k>)
{
if(k%)
d[i]++; //i转换成二进制有多少个1
k/=;
}
//printf("%d %d\n",i,d[i]);
}
ll ans=;
ld r;
cin>>r;
for(int i=;i<=;i++)
{
for(int j=i;j<=;j++)
{
int q=i&j,p=i|j;
ld k=(ld)d[q]/(ld)d[p];
if(k>=r)
{
if(i!=j)
ans+=c[i]*c[j];
else
ans+=c[i]*(c[i]-)/;
}
}
}
printf("%I64d\n",ans);
}
}