package main
import (
"io"
"os"
"strconv"
)
const (
present uint8 = 1
seenA uint8 = 2
seenMask uint8 = 4
)
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
x := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
x = x*10 + int(data[idx]-'0')
idx++
}
return x
}
n := nextInt()
m := nextInt()
N := 1 << n
flags := make([]uint8, N)
for i := 0; i < m; i++ {
flags[nextInt()] |= present
}
fullMask := uint32(N - 1)
stack := make([]uint32, 0, N)
ans := 0
for a := 0; a < N; a++ {
if flags[a]&present == 0 || flags[a]&seenA != 0 {
continue
}
ans++
flags[a] |= seenA
stack = stack[:0]
c := fullMask ^ uint32(a)
if flags[c]&seenMask == 0 {
flags[c] |= seenMask
stack = append(stack, c)
}
for len(stack) > 0 {
z := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if flags[z]&present != 0 && flags[z]&seenA == 0 {
flags[z] |= seenA
c2 := fullMask ^ z
if flags[c2]&seenMask == 0 {
flags[c2] |= seenMask
stack = append(stack, c2)
}
}
for s := z; s != 0; s &= s - 1 {
lb := s & -s
sub := z ^ lb
if flags[sub]&seenMask == 0 {
flags[sub] |= seenMask
stack = append(stack, sub)
}
}
}
}
os.Stdout.Write([]byte(strconv.Itoa(ans)))
}