#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define per(i,x,y) for (int i=(x);i>=(y);i--)
#define ll long long
using namespace std;
#define N 20
#define M 70005
#define mod 1000000007
int n,m,now,ans,a[N],f[2][M],fac[M],inv[M];
int ksm(int x,int p){
	int ret=1;
	for (;p;p>>=1,x=(ll)x*x%mod) if (p&1) ret=(ll)ret*x%mod;
	return ret;
}
void init(int n){
	fac[0]=1;
	rep (i,1,n) fac[i]=(ll)fac[i-1]*i%mod;
	inv[n]=ksm(fac[n],mod-2);
	per (i,n-1,0) inv[i]=(ll)inv[i+1]*(i+1)%mod;
}
int C(int n,int m){
	if (n<m) return 0;
	return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void upd(int &x,int y){x+=y;x-=x>=mod?mod:0;}
int cal(int x){return __builtin_popcount(x);}
int main(){
	init(70000);
	scanf("%d%d",&n,&m);
	rep (i,1,m) scanf("%d",&a[i]);
	sort(a+1,a+1+m,greater<int>());
	f[0][0]=1;now=0;
	rep (i,1,m){
		now^=1;memset(f[now],0,sizeof(f[now]));int tmp;
		rep (j,0,(1<<n)-1) if (tmp=f[now^1][j]){
			upd(f[now][j],tmp);//a[i]不作为某个区间最小值
			rep (k,0,n-1)
				if (!(j>>k&1))
					upd(f[now][j|1<<k],(ll)tmp*C((1<<n)-j-a[i],(1<<k)-1)%mod*fac[1<<k]%mod);
		}
	}
	ans=0;
	rep (i,0,(1<<n)-1){
		f[now][i]=(ll)f[now][i]*fac[(1<<n)-1-i]%mod;
		if (cal(i)&1) upd(ans,mod-f[now][i]);else upd(ans,f[now][i]);
	}
	ans=(ll)ans*ksm(2,n)%mod;
	cout<<ans;
	return 0;
}