#include <bits/stdc++.h>
using namespace std;
const int N = 27, M = (1 << 22) + 5;
int n, m, add;
int a[M];
bool ada[M], vis[2 * M + 5];
void dfs(int x) {
  stack<int> st;
  st.push(x);
  while (!st.empty()) {
    int u = st.top();
    st.pop();
    if (!vis[u]) {
      vis[u] = 1;
      int ori = (u >= add) ? (u - add) : u;
      int compU = 0;
      for (int i = 0; i < (int)(n); i++)
        if (~ori & (1 << i)) compU |= (1 << i);
      if (ori == u) {
        if (!vis[u + add]) st.push(u + add);
      } else {
        if (ada[compU] && !vis[compU]) st.push(compU);
        for (int i = 0; i < (int)(n); i++)
          if (compU & (1 << i)) {
            int nxt = (ori | (1 << i)) + add;
            if (!vis[nxt]) st.push(nxt);
          }
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  add = (1 << n);
  for (int i = 0; i < (int)(m); i++) {
    cin >> a[i];
    ada[a[i]] = 1;
  }
  int ans = 0;
  for (int i = 0; i < (int)(m); i++)
    if (!vis[a[i]]) {
      dfs(a[i]);
      ans++;
    }
  cout << ans << '\n';
  return 0;
}
