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

namespace TYC
{
	typedef long long ll;

	const int N = 1 << 16 | 5, mod = 1e9 + 7;

	int n, m, A[25], F[17][N], Fac[N], Inv[N], Cnt[N];

	int inv(const int x) { return x == 1 ? x : int((ll)inv(mod % x) * (mod - mod / x) % mod); }

	inline int C(const int x, const int y)
	{ return x < y ? 0 : int((ll)Fac[x] * Inv[y] % mod * Inv[x - y] % mod); }

	void work()
	{
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= m; i++)
			scanf("%d", &A[i]);
		sort(A + 1, A + 1 + m, greater<int>());
		int tot = 1 << n;
		Fac[0] = 1;
		for (int i = 1; i <= tot; i++)
			Fac[i] = int((ll)Fac[i - 1] * i % mod);
		Inv[tot] = inv(Fac[tot]);
		for (int i = tot; i; i--)
			Inv[i - 1] = int((ll)Inv[i] * i % mod);
		F[0][0] = 1;
		for (int i = 1; i <= m; i++)
			for (int s = 0; s < tot; s++)
			{
				F[i][s] = F[i - 1][s];
				for (int k = 0; k < n; k++)
					if (s & (1 << k))
					{
						int c = 1 << k, t = s ^ (1 << k);
						F[i][s] = int((F[i][s] + (ll)F[i - 1][t] * Fac[c] % mod * C(tot - A[i] - t, c - 1)) % mod);
					}
			}
		int ans = 0;
		for (int s = 0; s < tot; s++)
		{
			Cnt[s] = Cnt[s >> 1] + (s & 1);
			ans = int((ans + (ll)(Cnt[s] & 1 ? -1 : 1) * F[m][s] * Fac[tot - s - 1] % mod + mod) % mod);
		}
		printf("%d\n", int((ll)ans * tot % mod));
	}
}

int main()
{
	TYC::work();
	return 0;
}