#include #include #include #include #include #include #include #include #define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl; #define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using namespace std; typedef long long ll; const ll MOD = 1000000007; class ModInt{ public: ll v; ModInt(ll _v = 0){ if(_v >= MOD) _v %= MOD; v = _v; } ModInt operator+(ll n){ return ModInt((v+n)%MOD); } ModInt operator-(ll n){ return ModInt((v-n+MOD)%MOD); } ModInt operator*(ll n){ if(n >= MOD) n %= MOD; return ModInt((v*n)%MOD); } ModInt operator/(ll n){ return ModInt((ModInt(n).inv()*v).v%MOD); } void operator+=(ll n){ v = (v+n)%MOD; } void operator-=(ll n){ v = (v-n+MOD)%MOD; } void operator*=(ll n){ v = (v*n+MOD)%MOD; } ModInt operator+(ModInt n){ return ModInt((v+n.v)%MOD); } ModInt operator-(ModInt n){ return ModInt((v-n.v+MOD)%MOD); } ModInt operator*(ModInt n){ return ModInt((v*n.v)%MOD); } ModInt operator/(ModInt n){ return ModInt((n.inv()*v).v%MOD); } void operator+=(ModInt n){ v = (v+n.v)%MOD; } void operator-=(ModInt n){ v = (v-n.v+MOD)%MOD; } void operator*=(ModInt n){ v = (v*n.v)%MOD; } void operator=(ModInt n){ v = n.v; } bool operator==(ModInt n){ return v == n.v; } bool operator!=(ModInt n){ return v != n.v; } void operator=(ll n){ v = n%MOD; } ModInt inv(){ if(v == 1) return ModInt(1); else return ModInt(MOD-ModInt(MOD%v).inv().v*(MOD/v)%MOD); } }; ostream& operator<<(ostream& os, const ModInt& m){ os << m.v; return os; } istream & operator >> (istream &in, ModInt &m){ in >> m.v; return in; } ModInt pow(ModInt a, ll n) { ModInt ans = 1; ModInt tmp = a; for (int i = 0; i <= 60; i++) { ll m = (ll)1 << i; if (m & n) { ans *= tmp; } tmp *= tmp; } return ans; } #define N_MAX 200002 ModInt inv[N_MAX],fac[N_MAX],finv[N_MAX],pow2[N_MAX]; void init(){ fac[0]=1;fac[1]=1; finv[0]=1;finv[1]=1; inv[1]=1; pow2[0] = 1; pow2[1] = 2; for(int i=2;i> n; vector b(n); for(int i = 0; i < n; i++) cin >> b[i]; int pre = b[n-1]; mx[n-1] = popcount(b[n-1]); for(int i = n-2; i >= 0; i--){ if(b[i] != -1){ if((b[i]|pre) > pre){ cout << 0 << endl; return 0; } pre = b[i]; } mx[i] = popcount(pre); } for(int j = 1; j <= mx[0]; j++){ dp[0][j] = comb(mx[0], j); } for(int i = 1; i < n; i++){ if(b[i] != -1){ for(int j = 1; j <= mx[i-1]; j++){ int dif = mx[i]-j; mint tmp = (dif == 0 ? pow2[j]-1 : pow2[j]); dp[i][mx[i]] += dp[i-1][j]*tmp; } }else{ for(int j = 1; j <= mx[i-1]; j++){ for(int k = j; k <= mx[i]; k++){ int dif = k-j; mint tmp = (dif == 0 ? pow2[j]-1 : pow2[j]); dp[i][k] += dp[i-1][j]*comb(mx[i]-j, mx[i]-k)*tmp; } } } // for(int j = 1; j <= mx[i]; j++) cout << dp[i][j] << ' '; // cout << endl; } cout << dp[n-1][mx[n-1]] << endl; }