from itertools import * from bisect import * from math import * from collections import * from heapq import * from random import * from decimal import * import numpy as np import sys sys.setrecursionlimit(10 ** 6) int1 = lambda x: int(x) - 1 p2D = lambda x: print(*x, sep="\n") def II(): return int(sys.stdin.readline()) def MI(): return map(int, sys.stdin.readline().split()) def MI1(): return map(int1, sys.stdin.readline().split()) def MF(): return map(float, sys.stdin.readline().split()) def LI(): return list(map(int, sys.stdin.readline().split())) def LI1(): return list(map(int1, sys.stdin.readline().split())) def LF(): return list(map(float, sys.stdin.readline().split())) def LLI(rows_number): return [LI() for _ in range(rows_number)] dij = [(1, 0), (0, 1), (-1, 0), (0, -1)] def main(): def popcnt(x): return bin(x).count('1') md=10**9+7 n,k=MI() if k==0: print(factorial(n)%md) exit() aa=LI() aa.sort() for a0,a1 in zip(aa[-2::-1],aa[::-1]): if a0!=a0&a1: print(0) exit() ans=1 pa=0 for a in aa: #print(format(a,'b').zfill(n)) ans*=factorial(popcnt(a)-popcnt(pa)) ans%=md pa=a ans*=factorial(n-popcnt(pa)) print(ans%md) main()