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

#define CO const
#define IN inline
typedef long long LL;
typedef long double LD;

template<class T> T read(){
	T x=0,w=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
	for(;isdigit(c);c=getchar()) x=x*10+c-'0';
	return x*w;
}
template<class T> IN T read(T&x){
	return x=read<T>();
}

CO int mod=1e9+7;
IN int add(int a,int b){
	return (a+=b)>=mod?a-mod:a;
}
IN int mul(int a,int b){
	return (LL)a*b%mod;
}
IN int fpow(int a,int b){
	int ans=1;
	for(;b;b>>=1,a=mul(a,a))
		if(b&1) ans=mul(ans,a);
	return ans;
}
IN void cadd(int&a,int b){
	a=add(a,b);
}
IN void cmul(int&a,int b){
	a=mul(a,b);
}

CO int N=20,S=65536+10;
int a[N];
int fac[S],ifac[S],dp[N][S];

IN int binom(int n,int m){
	return mul(fac[n],mul(ifac[m],ifac[n-m]));
}
int main(){
	int n=read<int>(),m=read<int>();
	for(int i=m;i>=1;--i) read(a[i]);
	int all=1<<n;
	fac[0]=1;
	for(int i=1;i<=all;++i) fac[i]=mul(fac[i-1],i);
	ifac[all]=fpow(fac[all],mod-2);
	for(int i=all-1;i>=0;--i) ifac[i]=mul(ifac[i+1],i+1);
	dp[0][0]=1;
	for(int i=1;i<=m;++i)for(int s=0;s<all;++s){
		int left=all-a[i]+1-s;
		cadd(dp[i][s],dp[i-1][s]);
		for(int j=0;j<n;++j)if(~s>>j&1){
			if(left<1<<j) break;
			cadd(dp[i][s|1<<j],mul(dp[i-1][s],
				 mul(binom(left-1,(1<<j)-1),fac[1<<j])));
		}
	}
	int ans=fac[all-1];
	for(int s=1;s<all;++s){
		int sum=mul(dp[m][s],fac[all-1-s]);
		cadd(ans,__builtin_popcount(s)&1?mod-sum:sum);
	}
	cmul(ans,all);
	printf("%d\n",ans);
	return 0;
}
