#include <bits/stdc++.h>
using namespace std;
const int maxn = (1 << 22) + 100;
vector<int> G[maxn];
int f[maxn], val[maxn], dp[maxn];
int Find(int u) { return u == f[u] ? u : f[u] = Find(f[u]); }
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (m); i++) {
    int a;
    scanf("%d", &a);
    val[a] = true;
  }
  fill(dp, dp + (1 << n), (1 << n));
  for (int k = (0); k <= ((1 << n) - 1); k++) {
    if (val[k]) dp[k] = min(dp[k], k), G[k].push_back(k);
    if (dp[k] != (1 << n))
      for (int i = (0); i <= (n - 1); i++)
        if (((k >> i) & 1) == 0) {
          dp[k ^ (1 << i)] = min(dp[k ^ (1 << i)], dp[k]);
          if (G[k ^ (1 << i)].size() <= 3) G[k ^ (1 << i)].push_back(dp[k]);
        }
  }
  for (int i = (0); i <= ((1 << n) - 1); i++) f[i] = i;
  for (int i = (0); i <= ((1 << n) - 1); i++) {
    int t = ((1 << n) - 1) ^ i;
    if (val[i]) {
      for (int j = (0); j <= ((int)G[t].size() - 1); j++) {
        if (val[G[t][j]]) f[Find(i)] = Find(G[t][j]);
      }
    }
  }
  int ans = 0;
  for (int i = (0); i <= ((1 << n) - 1); i++) ans += val[i] && Find(i) == i;
  printf("%d\n", ans);
  return 0;
}
