CF986C
CF986C
给\(A_i\)连一条向补集的边和子集的边,然后dfs求联通块数
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int M = 7000001;
int n,m,k,f[M],s[25],N,g[M],d[M],a[M];
void dfs(int x)
{
if(f[x]) return ;
f[x]=1;
if(g[x]) dfs((1<<n)-1-x);
for(int i=0;i<=n;i++) if(x&(1<<i)) dfs(x-(1<<i));
}
int main()
{
scanf("%d%d",&n,&m);// N=m;
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
g[a[i]]=1;//g[(1<<n)-1-a[i]]=1;
}
for(int i=1;i<=m;i++)
if(!f[a[i]]) dfs((1<<n)-1-a[i]),N++;
printf("%d",N);
}