#include<bits/stdc++.h>
using namespace std;

const int mod=1000000007,N=17,M=(1<<N)+5;
typedef long long ll;
int ksm(ll a,int b,int c=1){
	for(;b;b/=2,a=a*a%mod)
		if(b&1)c=c*a%mod;
	return c;
}
int T,dp[2][M],n,m,jc[M],jc2[M],a[N],ans;
void init(){
	jc[0]=1;
	for(int i=1;i<=(1<<n);++i)jc[i]=(ll)jc[i-1]*i%mod;
	jc2[1<<n]=ksm(jc[1<<n],mod-2);
	for(int i=(1<<n);i;--i)jc2[i-1]=(ll)jc2[i]*i%mod;
}
int A(int n,int k){
	if(n<k||k<0)return 0;
	return (ll)jc[n]*jc2[n-k]%mod;
}
inline void upd(int&x,const int&y){
	x+=y-mod;x+=x>>31&mod;
}

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;init();
	for(int i=1;i<=m;++i)cin>>a[i],a[i]=(1<<n)-a[i]+1;
	dp[0][0]=1;
	for(int i=m;i;--i){
		T^=1;memset(dp[T],0,sizeof dp[T]);
		for(int j=0;j<(1<<n);++j)if(dp[!T][j]){
			upd(dp[T][j],dp[!T][j]);
			for(int k=0;k<n;++k)if(!(j>>k&1))
				dp[T][j|(1<<k)]=(dp[T][j|(1<<k)]-(ll)dp[!T][j]*(A(a[i]-j,1<<k)-A(a[i]-j-1,1<<k)))%mod,
				dp[T][j|(1<<k)]+=dp[T][j|(1<<k)]>>31&mod;
		}
	}
	for(int i=0;i<(1<<n);++i)ans=(ans+(ll)jc[(1<<n)-i-1]*dp[T][i])%mod;
	ans=((ll)ans<<n)%mod;
	cout<<ans<<'\n';
	return 0;
}
