#include <cstdio>
#include <algorithm>

typedef long long ll;
const int maxn=16,maxm=18,maxk=(1<<maxn)+maxn,mod=1000000007;
int key[maxm],cnt[maxk];
ll fac[maxk],ifac[maxk],f[maxm][maxk],g[maxm];

ll power(ll a,ll b){
	ll ret=1;
	while(b){
		if(b&1)ret=ret*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ret;
}

ll inv(ll a){
	return power(a,mod-2);
}

ll C(int n,int m){
	if(n<m)return 0;
	else return fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}

int main(){
	// freopen("in.txt","r",stdin);
	int n,m,lim;
	scanf("%d%d",&n,&m);lim=1<<n;
	for(int i=1;i<=m;++i)scanf("%d",key+i);
	std::sort(key+1,key+m+1);
	fac[0]=ifac[0]=1;
	for(int i=1;i<=lim;++i)fac[i]=fac[i-1]*i%mod;
	ifac[lim]=inv(fac[lim]);
	for(int i=lim-1;i>=1;--i)ifac[i]=ifac[i+1]*(i+1)%mod;
	for(int i=1;i<lim;++i)cnt[i]=cnt[i>>1]+(i&1);
	f[m+1][0]=1;
	for(int i=m;i>=1;--i){
		for(int j=0;j<lim;++j)if(f[i+1][j]){
			f[i][j]+=f[i+1][j];
			for(int k=0;k<n;++k)if(!(j&(1<<k)))
				f[i][j|(1<<k)]+=f[i+1][j]*C(lim-key[i]-j,(1<<k)-1)%mod*fac[1<<k]%mod;
		}
		for(int j=0;j<lim;++j)
			f[i][j]%=mod;
	}
	for(int i=0;i<lim;++i)
		g[cnt[i]]=(g[cnt[i]]+f[1][i]*fac[lim-i-1]%mod)%mod;
	ll ans=0;
	for(int i=0;i<=n;++i)
		ans=(ans+g[i]*(i%2?-1:1)+mod)%mod;
	printf("%lld\n",ans*lim%mod);
	// printf("%lld\n",ans);
	return 0;
}