#include <stdio.h>
#include <algorithm>
using namespace std;

const int mod = 1000000007;
long long inv[100100]={0,1},fact[100100]={1,1},ifact[100100]={1,1};
int N,M,U[16]; long long prv[1<<16];

int main()
{
	for (int i=2;i<100100;i++){
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		fact[i] = fact[i-1] * i % mod;
		ifact[i] = ifact[i-1] * inv[i] % mod;
	}

	scanf ("%d %d",&N,&M);
	for (int i=0;i<M;i++) scanf ("%d",&U[i]);
	sort(U,U+M);
	reverse(U,U+M);

	prv[0] = 1;
	for (int i=0;i<M;i++){
		for (int j=(1<<N)-1;j>=0;j--) if (prv[j]){
			int rem = (1<<N) - U[i] - j;
			if (rem < 0) continue;
			for (int k=0;k<N;k++) if (~j & (1 << k)){
				if (rem < (1<<k)-1) break;
				long long coeff = (1<<k) * prv[j] % mod * fact[rem] % mod * ifact[rem-(1<<k)+1] % mod;
				prv[j+(1<<k)] = (prv[j+(1<<k)] + mod - coeff) % mod;
			}
		}
	}

	long long ans = 0;
	for (int j=0;j<(1<<N);j++){
		ans = (ans + prv[j] * fact[(1<<N)-1-j]) % mod;
	}

	for (int i=0;i<N;i++) ans = ans * 2 % mod;

	printf ("%lld\n",ans);

	return 0;
}