#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include #include namespace mp = boost::multiprecision; using Bint = mp::cpp_int; int main() { int n, k; Bint a[66]; bitset<66> bit[66]; cin >> n >> k; for (int i = 0; i < k; i++) { cin >> a[i]; } sort(a, a + k); for (int i = 0; i < k; i++) { int co = -1; while (a[i] >= 1) { co++; if (a[i] % 2 == 1) { bit[i].set(co); } a[i] /= 2; } bit[i][co] = 1; } long long ans = 1; for (int i = 1; i < k; i++) { long long co = 0; for (int j = 0; j < 61; j++) { if (!bit[i][j] && bit[i - 1][j]) { cout << "0" << endl; return 0; } if (bit[i][j] && !bit[i - 1][j]) { co++; } } for (long long j = co; j > 0; j--) { ans *= j; ans %= 1000000007; } } long long co = 0; for (int j = 0; j < 61; j++) { if (bit[0][j]) { co++; } } for (long long j = co; j > 0; j--) { ans *= j; ans %= 1000000007; } co = 0; for (int j = 0; j < n; j++) { if (!bit[k-1][j]) { co++; } } for (long long j = co; j > 0; j--) { ans *= j; ans %= 1000000007; } cout << ans << endl; return 0; }