/* -*- coding: utf-8 -*- * * 462.cc: No.462 6日知らずのコンピュータ - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 60; typedef long long ll; const ll MOD = 1000000007; /* typedef */ typedef pair pil; typedef deque dqil; /* global variables */ ll fracs[MAX_N + 1]; dqil as; /* subroutines */ /* main */ int main() { int n, k; cin >> n >> k; fracs[0] = 1; for (int i = 1; i <= n; i++) fracs[i] = (fracs[i - 1] * i) % MOD; for (int i = 0; i < k; i++) { ll ai; cin >> ai; int c = 0; for (ll a = ai; a != 0; a >>= 1) if ((a & 1) != 0) c++; as.push_back(pil(c, ai)); } sort(as.begin(), as.end()); if (as.empty() || as.front().first != 0) as.push_front(pil(0, 0)); if (as.back().first != n) as.push_back(pil(n, (1LL << n) - 1)); k = as.size(); //for (dqil::iterator dit = as.begin(); dit != as.end(); dit++) //printf("%d,%lld\n", dit->first, dit->second); ll ans = 1; for (int i = 1; i < k; i++) { if (as[i - 1].first == as[i].first || (as[i - 1].second & as[i].second) != as[i - 1].second) { ans = 0; break; } ans = (ans * fracs[as[i].first - as[i - 1].first]) % MOD; } printf("%lld\n", ans); return 0; }