#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll P=1000000007;
const int maxn=(1<<16)+4;
int n,m;
ll ans;
int v[20],cnt[maxn],Log[maxn];
ll f[17][maxn],jc[maxn],jcc[maxn],ine[maxn];
bool cmp(const int &a,const int &b)
{
	return a>b;
}
inline ll A(int a,int b)
{
	if(a<b)	return 0;
	return jc[a]*jcc[a-b]%P;
}
int main()
{
	scanf("%d%d",&n,&m);
	int i,S,T,j,a;
	for(i=1;i<=m;i++)	scanf("%d",&v[i]),v[i]--;
	sort(v+1,v+m+1,cmp);
	for(i=0;i<n;i++)	Log[1<<i]=i;
	for(i=1;i<(1<<n);i++)	cnt[i]=cnt[i-(i&-i)]+1;
	ine[0]=ine[1]=jc[0]=jc[1]=jcc[0]=jcc[1]=1;
	for(i=2;i<=(1<<n);i++)	ine[i]=P-(P/i)*ine[P%i]%P,jc[i]=jc[i-1]*i%P,jcc[i]=jcc[i-1]*ine[i]%P;

	f[0][0]=1;
	for(i=1;i<=m;i++)
	{
		f[i][0]=1;
		for(S=1;S<(1<<n);S++)
		{
			f[i][S]=f[i-1][S];
			for(j=S;j;j-=j&-j)
			{
				a=Log[j&-j],T=S^(1<<a);
				f[i][S]=(f[i][S]+f[i-1][T]*A((1<<n)-v[i]-1-T,(1<<a)-1)%P*(1<<a))%P;
			}
		}
	}
	for(S=0;S<(1<<n);S++)
	{
		ans=(ans+((cnt[S]&1)?-1:1)*f[m][S]*jc[(1<<n)-1-S])%P;
	}
	printf("%lld",(ans+P)*(1<<n)%P);
	return 0;
}//3 2 2 3
