#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Mod=1e9+7;
int n,m,N,a[110000],dp[1100][1100],sum[110000];
bool vis[110000];
ll fac[110000],inv[110000],f[21][110000],ans;
inline bool cmp(int a,int b){ return a>b;}
inline int ADD(int x){
	if (x>=Mod) x-=Mod;
	return x;
}
inline int MINUS(int x){
	if (x<0) x+=Mod;
	return x;
}
ll C(ll n,ll m){
	if (n<m) return 0ll;
	return fac[n]*inv[m]%Mod*inv[n-m]%Mod;
}
int main(){
	fac[0]=1; for (int i=1;i<=100000;++i) fac[i]=fac[i-1]*i%Mod;
	inv[1]=1; for (int i=2;i<=100000;++i) inv[i]=(Mod-Mod/i)*inv[Mod%i]%Mod;
	inv[0]=1; for (int i=2;i<=100000;++i) inv[i]=inv[i-1]*inv[i]%Mod;
	sum[0]=0; for (int i=1;i<=100000;++i) sum[i]=sum[i>>1]+(i&1);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++) scanf("%d",&a[i]);
	sort(a+1,a+m+1,cmp);
	f[0][0]=1; N=(1<<n);
	for (int i=1;i<=m;i++)
		for (int j=0;j<N;j++){
			f[i][j]=f[i-1][j];
			for (int k=0;k<n;k++){
				int S=(1<<k);
				if (j&S) f[i][j]=ADD((ll)f[i-1][j^S]*C(N-(j^S)-a[i],S-1)%Mod*fac[S]%Mod+f[i][j]);
			}
		}
	for (int j=0;j<N;j++){
		int tot=sum[j]; 
		if (tot&1) ans=MINUS(ans-(ll)fac[N-j-1]*f[m][j]%Mod);
		else ans=ADD(ans+(ll)fac[N-j-1]*f[m][j]%Mod);
	}
	printf("%lld\n",ans*N%Mod);
	return 0;
}
