#include<bits/stdc++.h> using namespace std; typedef unsigned int uint; typedef long long int ll; typedef unsigned long long int ull; #define debugv(v) printf("L%d %s => ",__LINE__,#v);for(auto e:v){cout<<e<<" ";}cout<<endl; #define debugm(m) printf("L%d %s is..\n",__LINE__,#m);for(auto v:m){for(auto e:v){cout<<e<<" ";}cout<<endl;} #define debuga(m,w) printf("L%d %s is => ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout<<endl; #define debugaa(m,w,h) printf("L%d %s is..\n",__LINE__,#m);for(int y=0;y<(h);y++){for(int x=0;x<(w);x++){cout<<(m)[x][y]<<" ";}cout<<endl;} #define ALL(v) (v).begin(),(v).end() #define BIGINT 0x7FFFFFFF #define E107 1000000007 void printbit(int u){if(u==0)cout<<0;else{int s=0,k=0;for(;0<u;u>>=1,k++)s=(s<<1)|(u&1);for(;0<k--;s>>=1)cout<<(s&1);}} #define TIME chrono::system_clock::now() #define MILLISEC(t) (chrono::duration_cast<chrono::milliseconds>(t).count()) template<typename T1,typename T2> ostream& operator <<(ostream &o,const pair<T1,T2> p){o<<"("<<p.first<<":"<<p.second<<")";return o;} template<typename T> T permm(T n, T r, T mod){ T p=1; for (;r<n;p=(p*n--)%mod); return p; } int width,height; ll m,n; ll data[100]; int main(){ int i,j,k; ll x,y,a,b; cin >> n >> m; bool headflg=false,tailflg=false; for (i=0;i<m;i++){ cin >> data[i]; headflg|=data[i]==0; tailflg|=data[i]==((1ll<<n)-1ll); } if (!headflg){ data[m++]=0; } if (!tailflg){ data[m++]=((1ll<<n)-1ll); } sort(data,data+m,[](ll l,ll r){return __builtin_popcountll(l) < __builtin_popcountll(r);}); ll result=1; ll cnt = 0; ll last=0; for (i=0;i<m;i++){ a = __builtin_popcountll(data[i]); if ((data[i]&last)!=last || a<cnt){ result = 0; break; } if (a>cnt) result = (result*permm(a-cnt,1ll,(ll)E107))%E107; cnt = a; last = data[i]; } cout << result << endl; return 0; }